2017-04-18 177 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 –