微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于多个条件的 Xarray 掩码区域

如何解决基于多个条件的 Xarray 掩码区域

我正在查看全局 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()

这就是它的样子

enter image description here

左侧面板是原始数据,至少中间的面板我设法保留了我想要的数据 - 但不是两个巨大的紫罗兰色块,我想将所选区域外的所有值都设置为零的地图.右侧面板旨在成为中间面板的“反向”,但我在那里完全失败了。感觉这应该是一件很容易的事情,但我就是想不通!

解决方法

这似乎主要是逻辑方面的问题,以及用于处理 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,所以这可能非常笨拙,我相信其他人会有更优雅和知识渊博的答案,但它吸引了我,所以我尝试了 :)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。