python-xarray 将掩码从一个 DataArray 复制到另一个
python-xarray copy mask from one DataArray to another
我得到这个来处理一个简单的案例:
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 具有维度名称 lon 和 lat,而 Hs 具有维度名称经度和纬度,它正在创建一个 5 维 DataArray 并且没有正确拾取掩码。
无论维度名称是否不同或 DataArray 大小是否不同,我都可以选择掩码吗?
我之前用 numpy.math (ma) 做过这个:
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)
但希望learn/use xarray.
干杯,
雷
您需要明确重命名维度名称以匹配,例如 hs = hs.rename({'lat': 'latitude', 'longitude': 'longitude'})
。如果坐标标签不完全匹配,您可能还需要使用 nearest-neighbor indexing 重新索引,例如 hs.reindex_like(ws10, method='nearest', tolerance=0.01)
.
或者,不太安全,您可以从第二个参数中删除坐标标签,而只传入一个未标记的数组,例如 ws10.where(hs.data > 0)
。但是我不推荐这个选项,因为没有什么能保证元数据的一致性。
我得到这个来处理一个简单的案例:
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 具有维度名称 lon 和 lat,而 Hs 具有维度名称经度和纬度,它正在创建一个 5 维 DataArray 并且没有正确拾取掩码。
无论维度名称是否不同或 DataArray 大小是否不同,我都可以选择掩码吗?
我之前用 numpy.math (ma) 做过这个:
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)
但希望learn/use xarray.
干杯, 雷
您需要明确重命名维度名称以匹配,例如 hs = hs.rename({'lat': 'latitude', 'longitude': 'longitude'})
。如果坐标标签不完全匹配,您可能还需要使用 nearest-neighbor indexing 重新索引,例如 hs.reindex_like(ws10, method='nearest', tolerance=0.01)
.
或者,不太安全,您可以从第二个参数中删除坐标标签,而只传入一个未标记的数组,例如 ws10.where(hs.data > 0)
。但是我不推荐这个选项,因为没有什么能保证元数据的一致性。