2017-04-18 1 views
1

je suis arrivé que cela fonctionne pour un cas simple:masque de copie python-xarray d'un DataArray à un autre

arr2 = xr.DataArray((np.arange(16)-8).reshape(4, 4), dims=['x', 'y']) 
arr3 = xr.DataArray(np.arange(16).reshape(4, 4), dims=['x', 'y']) 
<xarray.DataArray (x: 4, y: 4)> 
array([[ nan, nan, nan, nan], 
[ nan, nan, nan, nan], 
[ nan, 9., 10., 11.], 
[ 12., 13., 14., 15.]]) 
Dimensions without coordinates: x, y 

Cependant, je suis avoir troublant application aux fichiers NetCDF. J'ai deux ensembles de données: hauteur de vague significative (Hs) et vitesse du vent (ws). Je voudrais utiliser le masque d'où Hs < 0 et l'appliquer à ws. La taille des jeux de données est [temps = 1, lat = 81, lon = 131]. Il y aura un temps dans les futurs où mon ws DataArray aura une taille légèrement différente, par exemple. [temps = 1, ens = 10, lat = 81, ion = 131].

Si je tente:

f = xr.open_dataset('CCSM4_ens1_19821201_19831130_ws10_0_NAtl_DJFmean.nc') 
ws10 = f.ws10 
f = xr.open_dataset('ww3.Hs.19820901_19830831_NAtl_DJFmean.nc') 
hs = f.hs 
ws10_masked = ws10.where(hs > 0) 

ws10_masked ressemble:

xarray.DataArray (time: 1, lat: 81, lon: 131, latitude: 81, longitude: 131) 
array([[[[[ nan, ..., nan], 
     ..., 
     [ nan, ..., nan]], 
    ..., 
    [[ nan, ..., nan], 
     ..., 
     [ nan, ..., nan]]], 
     ..., 
     [[[ nan, ..., nan], 
     ..., 
     [ nan, ..., nan]], 
     ..., 
     [[ nan, ..., nan], 
     ..., 
     [ nan, ..., nan]]]]]) 
Coordinates: 
* lat  (lat) float64 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 ... 
* lon  (lon) float64 260.0 261.0 262.0 263.0 264.0 265.0 266.0 267.0 ... 
* time  (time) datetime64[ns] 1983-01-15T12:00:00 
* latitude (latitude) float32 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 ... 
* longitude (longitude) float32 -100.0 -99.0 -98.0 -97.0 -96.0 -95.0 
... 
Attributes: 
associated_files: baseURL: http://cmip- 
pcmdi.llnl.gov/CMIP5/dataLocation... 
cell_methods:  time: mean 
history:   2014-07-03T07:58:56Z altered by CMOR: Treated 
scalar d... 
long_name:   Eastward Near-Surface Wind 
standard_name:  eastward_wind 
units:    m s-1 

Vous pouvez voir parce ws a des noms de dimension LON et lat où que Hs a des noms de dimension longitude et la latitude, il crée une 5 dimension DataArray et ne pas choisir le masque correctement.

De toute façon je peux choisir le masque indépendamment si les noms de dimensions sont différents ou si les DataArrays sont de tailles différentes?

je l'ai fait précédemment avec ce numpy.math (ma) comme:

hs = f.variables['hs'][:] 
hs_masked = ma.masked_values(hs, -65.534004) 
tmp = np.zeros((len(lat), len(lon)) 
# Create masked array 
data_cs = ma.masked_values(tmp, 0) 
# Read new file 
tmp = f.variables['cusp'][:] 
data_cs[:,:] = ma.masked_array(tmp, hs_masked.mask) 

Mais l'espoir d'apprendre/utiliser xarray.

Cheers, Ray

Répondre

2

Vous devrez renommer explicitement les noms de dimension pour correspondre, par exemple, hs = hs.rename({'lat': 'latitude', 'longitude': 'longitude'}). Vous devrez peut-être également réindexer avec nearest-neighbor indexing, si les étiquettes de coordonnées ne correspondent pas exactement, par exemple, hs.reindex_like(ws10, method='nearest', tolerance=0.01). Ou, moins sûrement, vous pouvez supprimer les étiquettes de coordonnées du deuxième argument, et simplement passer dans un tableau non étiqueté à la place, par exemple ws10.where(hs.data > 0). Mais je ne recommande pas cette option, car rien ne garantit la cohérence des métadonnées.

+0

J'ai dû modifier la longitude du hs DataArray ainsi que le fichier hs avait la longitude: -100 à 30, où ws10 avait la longitude: 260 à 30. hs.coords ['lon'] = lon # où lon vient de ws10 Y at-il une fonction intégrée dans xarray pour convertir la longitude de -180: 180 à 0: 360 et vice versa? Le code est assez simple lon180 = ((lon360 + 180)% 360) - 180 lon360 = lon180% 360 –