2016-11-23 1 views
1

J'ai écrit quelques xarray.Datasets qui ont plusieurs variables. Actuellement, afin de garder la taille gérable, je spécifie le codage, par ex. zlib, mais doit être appliqué sur une variable (dataArray) par variable.Spécifiez l'encodage/la compression pour de nombreuses variables dans le jeu de données xarray lorsque vous écrivez to_netcdf

Quelle est la bonne façon d'appliquer le même argument de codage à toutes les variables? par exemple.

<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 ... 

lors de l'écriture sur cet ensemble de données, nous utiliserions:

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}}) 

Pour plus de variables cela devient très verbeux. Une option consisterait à écrire chaque dataarray sur le netcdf dans un appendice séquentiel, mais cela semble également compliqué lorsque l'ensemble de données est prêt à partir.

Répondre

4

Je viens de créer le paramètre d'encodage dynamique:

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

Merci - c'est une solution élégante! – dreab