2016-11-23 3 views
1

Я писал несколько xarray.Datasets, которые имеют несколько переменных. В настоящее время, чтобы сохранить управляемый размер, я указываю кодировку, например. zlib, но необходимо применять переменную (dataArray) переменной переменной.Укажите кодировку/сжатие для многих переменных в наборе данных xarray при записи в файл to_netcdf

Каков наилучший способ применения одного и того же аргумента кодирования ко всем переменным? например

<xarray.Dataset> 
Dimensions: (lat: 1440, lon: 2880) 
Coordinates: 
    * lat  (lat) float64 -90.0 -89.88 -89.75 -89.62 -89.5 -89.38 -89.25 ... 
    * lon  (lon) float64 -180.0 -179.9 -179.8 -179.6 -179.5 -179.4 -179.2 ... 
Data variables: 
a1  (lat, lon) float64 nan nan nan nan nan nan nan nan 0.0 ... 
b  (lat, lon) float64 nan nan nan nan nan nan 0.0 0.0 0.0 ... 
c  (lat, lon) float64 nan nan nan nan nan nan nan nan 0.0 ... 
d  (lat, lon) float64 nan nan nan nan nan nan nan nan 0.0 ... 
e  (lat, lon) float64 nan nan nan nan nan nan nan nan 0.0 ... 

при записи этого набора данных, мы будем использовать:

ds.to_netcdf(filename, encoding={'a1':{'zlib': True,'complevel': 5},'b':{'zlib': True,'complevel': 5},'c':{'zlib': True,'complevel': 5},'d':{'zlib': True,'complevel': 5},'e':{'zlib': True,'complevel': 5}}) 

Для более переменных это становится очень долго наматывается. Одним из вариантов было бы записать каждый dataarray в netcdf в последовательном добавлении, но это также кажется запутанным, когда набор данных готов к работе.

ответ

4

Я бы просто создать параметр кодирования динамически:

comp = dict(zlib=True, complevel=5) 
encoding = {var: comp for var in ds.data_vars} 
ds.to_netcdf(filename, encoding=encoding) 
+1

Спасибо - это элегантное решение! – dreab