如果一个维度上的所有值都为零,则将 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]]])

具有三个维度:bandxy

我想在 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'))