2017-04-18 175 views
1

我得到这个为一个简单的情况下工作:蟒蛇-xarray副本面具从一个DataArray中另一个

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 

但是,我遇到困扰申请的NetCDF文件。 我有两个数据集:有效波高(Hs)和风速(ws)。 我想使用哪里Hs < 0的掩码并将其应用于ws。 数据集的大小为[time = 1,lat = 81,lon = 131]。我的ws DataArray会有一个稍微不同的大小, [时间= 1,ENS = 10,LAT = 81,LON = 131]。

如果我尝试:

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样子:

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 

你可以看到,因为WS具有维度名称经度和纬度,其中作为房协维度名称的经度和纬度是创建5维DataArray,而不是正确地选择掩码。

无论尺寸名称是不同的还是DataArrays大小不同,我可以采用任何方式选择遮罩?

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) 

但希望学习/使用xarray:

我以前用numpy.math(MA)的这样做。

干杯, 雷

回答

2

您需要明确命名维度名称相匹配,例如,hs = hs.rename({'lat': 'latitude', 'longitude': 'longitude'})。如果坐标标签不完全匹配,您可能还需要使用nearest-neighbor indexing进行重新索引,例如,hs.reindex_like(ws10, method='nearest', tolerance=0.01)

或者不那么安全,您可以从第二个参数中去掉坐标标签,而不是传入未标记的数组,例如ws10.where(hs.data > 0)。但我不推荐这个选项,因为没有任何内容保证元数据的一致性。

+0

我不得不编辑hs DataArray的经度以及hs文件的经度:-100至30,其中ws10的经度为260至30。其中lon是从ws10 xarray中是否有内置函数将经度从-180:180转换为0:360,反之亦然? 该代码相当直接 lon180 =((lon360 + 180)%360) - 180 lon360 = lon180%360 –