基于多个条件的 Xarray 蒙版区域
Xarray mask region based on multiple conditions
我正在查看全局 netcdf 文件。我想将 60-75 度 N 波段内的所有陆地点设置为零,但将该波段中的海洋点保持为 nan。第二步,我想将陆地点的值保持在 60-75 之间,但将所有其他陆地点设置为零。海洋值是 NaN。我只是没有让我的 xarray 脚本执行此操作 - 这是我尝试过的
import numpy as np
import matplotlib.pyplot as plt
ds = xr.open_dataset('ifle.nc')
ds['Shrub_total'] = ds['Shrub']
shrub_total = ds.Shrub_total
tundra = shrub_total.where((shrub_total!=np.nan)&(shrub_total.Lat>60)&
(shrub_total.Lat<75), 0)
shrub = shrub_total.where((shrub_total!=np.nan)&(shrub_total.Lat<60)&
(shrub_total.Lat>75), 0)
ds['Tundra'] = tundra
ds['Shrub'] = shrub
fig, axes = plt.subplots(ncols=2,figsize=(12,3))
ds['Shrub_total'].isel(Time=0).plot(ax=axes[0])
ds['Tundra'].isel(Time=0).plot(ax=axes[1])
ds['Shrub'].isel(Time=0).plot(ax=axes[2])
plt.show()
这是它的样子
左边的面板是原始数据,对于中间的面板,至少我设法保留了我想要的数据 - 但我不想保留两个巨大的紫色块,而是保留所有值都在选定区域集之外的地图归零。右侧面板本来是中间面板的 'inverse',但我在那里完全失败了。感觉这应该是一件很容易做的事情,但我就是想不通!
这似乎主要是逻辑方面的问题,以及用于处理 NaN 的方法。
以下似乎对我有用:
tundra = shrub_total.where((np.isnan(shrub_total)==True)|
((shrub_total.Lat>60)&(shrub_total.Lat<75)), 0)
shrub = shrub_total.where((np.isnan(shrub_total)==True)|
((shrub_total.Lat<60)|(shrub_total.Lat>75)), 0)
- 我将
shrub
逻辑更改为 OR 语句(我们想屏蔽小于 60 或大于 75 - 不可能同时屏蔽两个!)。
- 我们使用 np.isnan()==True 而不是 ()!=np.nan。我不确定为什么我们不能像您那样对待它...这需要进一步改变逻辑。
请注意,我不使用 python,所以这可能很老套,而且我相信其他人会有更优雅和知识渊博的答案,但它引起了我的兴趣,所以我尝试了 :)
我正在查看全局 netcdf 文件。我想将 60-75 度 N 波段内的所有陆地点设置为零,但将该波段中的海洋点保持为 nan。第二步,我想将陆地点的值保持在 60-75 之间,但将所有其他陆地点设置为零。海洋值是 NaN。我只是没有让我的 xarray 脚本执行此操作 - 这是我尝试过的
import numpy as np
import matplotlib.pyplot as plt
ds = xr.open_dataset('ifle.nc')
ds['Shrub_total'] = ds['Shrub']
shrub_total = ds.Shrub_total
tundra = shrub_total.where((shrub_total!=np.nan)&(shrub_total.Lat>60)&
(shrub_total.Lat<75), 0)
shrub = shrub_total.where((shrub_total!=np.nan)&(shrub_total.Lat<60)&
(shrub_total.Lat>75), 0)
ds['Tundra'] = tundra
ds['Shrub'] = shrub
fig, axes = plt.subplots(ncols=2,figsize=(12,3))
ds['Shrub_total'].isel(Time=0).plot(ax=axes[0])
ds['Tundra'].isel(Time=0).plot(ax=axes[1])
ds['Shrub'].isel(Time=0).plot(ax=axes[2])
plt.show()
这是它的样子
左边的面板是原始数据,对于中间的面板,至少我设法保留了我想要的数据 - 但我不想保留两个巨大的紫色块,而是保留所有值都在选定区域集之外的地图归零。右侧面板本来是中间面板的 'inverse',但我在那里完全失败了。感觉这应该是一件很容易做的事情,但我就是想不通!
这似乎主要是逻辑方面的问题,以及用于处理 NaN 的方法。
以下似乎对我有用:
tundra = shrub_total.where((np.isnan(shrub_total)==True)|
((shrub_total.Lat>60)&(shrub_total.Lat<75)), 0)
shrub = shrub_total.where((np.isnan(shrub_total)==True)|
((shrub_total.Lat<60)|(shrub_total.Lat>75)), 0)
- 我将
shrub
逻辑更改为 OR 语句(我们想屏蔽小于 60 或大于 75 - 不可能同时屏蔽两个!)。 - 我们使用 np.isnan()==True 而不是 ()!=np.nan。我不确定为什么我们不能像您那样对待它...这需要进一步改变逻辑。
请注意,我不使用 python,所以这可能很老套,而且我相信其他人会有更优雅和知识渊博的答案,但它引起了我的兴趣,所以我尝试了 :)