如果一个维度上的所有值都为零,则将 xarray DataArray 中的值设置为 NaN
Set values in xarray DataArray to NaN if all values across a dimension are zero
我有一个像这样的 xarray:
import xarray as xr
da1 = xr.DataArray([[0, 1, 5, 5], [1, 2, 2, 0], [9, 3, 2, 0]], dims=['x', 'y'])
da2 = xr.DataArray([[0, 2, 9, 3], [0, 0, 7, 0], [0, 2, 6, 0]], dims=['x', 'y'])
da3 = xr.DataArray([[0, 7, 2, 0], [7, 2, 6, 0], [0, 6, 1, 0]], dims=['x', 'y'])
combined = xr.concat([da1, da2, da3], 'band')
看起来像这样:
array([[[0, 1, 5, 5],
[1, 2, 2, 0],
[9, 3, 2, 0]],
[[0, 2, 9, 3],
[0, 0, 7, 0],
[0, 2, 6, 0]],
[[0, 7, 2, 0],
[7, 2, 6, 0],
[0, 6, 1, 0]]])
具有三个维度:band
、x
和 y
。
我想在 band
维度上的所有值都为零的情况下将此数组中的值设置为 NaN。例如,combined.isel(x=0, y=0)
处的值应设置为 NaN,因为所有这些值都为零,但 combined.isel(x=1, y=1)
处的值不应设置为 NaN,因为只有一个值是零。
我该怎么做?
我试过使用:
combined.where(combined != 0)
但这会将所有零值设置为 NaN,这不是我想要的。
然后我尝试了类似的方法:
combined.where((combined.isel(band=0) != 0) & (combined.isel(band=1) != 0) & (combined.isel(band=2) != 0))
但是 'and' 位似乎没有正常工作,它给出了一个奇怪的(和不正确的)结果。
更新: 作为扩展,我希望能够做同样的事情,但对于非常小的值,而不是零。例如,如果 band
维度上的所有值都小于 0.01,则将该维度上的所有值设置为 NaN。有没有简单的方法来做到这一点?
非常感谢任何建议
你可以这样做:
combined.where(combined.any(dim = 'band'))
我有一个像这样的 xarray:
import xarray as xr
da1 = xr.DataArray([[0, 1, 5, 5], [1, 2, 2, 0], [9, 3, 2, 0]], dims=['x', 'y'])
da2 = xr.DataArray([[0, 2, 9, 3], [0, 0, 7, 0], [0, 2, 6, 0]], dims=['x', 'y'])
da3 = xr.DataArray([[0, 7, 2, 0], [7, 2, 6, 0], [0, 6, 1, 0]], dims=['x', 'y'])
combined = xr.concat([da1, da2, da3], 'band')
看起来像这样:
array([[[0, 1, 5, 5],
[1, 2, 2, 0],
[9, 3, 2, 0]],
[[0, 2, 9, 3],
[0, 0, 7, 0],
[0, 2, 6, 0]],
[[0, 7, 2, 0],
[7, 2, 6, 0],
[0, 6, 1, 0]]])
具有三个维度:band
、x
和 y
。
我想在 band
维度上的所有值都为零的情况下将此数组中的值设置为 NaN。例如,combined.isel(x=0, y=0)
处的值应设置为 NaN,因为所有这些值都为零,但 combined.isel(x=1, y=1)
处的值不应设置为 NaN,因为只有一个值是零。
我该怎么做?
我试过使用:
combined.where(combined != 0)
但这会将所有零值设置为 NaN,这不是我想要的。
然后我尝试了类似的方法:
combined.where((combined.isel(band=0) != 0) & (combined.isel(band=1) != 0) & (combined.isel(band=2) != 0))
但是 'and' 位似乎没有正常工作,它给出了一个奇怪的(和不正确的)结果。
更新: 作为扩展,我希望能够做同样的事情,但对于非常小的值,而不是零。例如,如果 band
维度上的所有值都小于 0.01,则将该维度上的所有值设置为 NaN。有没有简单的方法来做到这一点?
非常感谢任何建议
你可以这样做:
combined.where(combined.any(dim = 'band'))