Tengo un xarray como este:

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')

Se ve así:

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]]])

Con tres dimensiones: band, x y y.

Quiero establecer los valores en esta matriz en NaN en las situaciones en las que todos los valores en la dimensión band son cero. Por ejemplo, los valores en combined.isel(x=0, y=0) deben establecerse en NaN, ya que todos esos valores son cero, pero los valores en combined.isel(x=1, y=1) no deben serlo, ya que solo uno de los valores es cero.

¿Cómo puedo hacer esto?

He intentado usar:

combined.where(combined != 0)

Pero esto establece todos los valores que son cero a NaN, lo que no hace lo que quiero.

Luego probé algo como:

combined.where((combined.isel(band=0) != 0) & (combined.isel(band=1) != 0) & (combined.isel(band=2) != 0))

Pero el bit 'y' no parece funcionar correctamente y da un resultado extraño (e incorrecto).

Actualización: Como extensión, me gustaría poder hacer lo mismo pero para valores muy pequeños, en lugar de ceros. Por ejemplo, establecer todos los valores en la dimensión band en NaN si todos los valores en esa dimensión son < 0,01. ¿Hay una forma fácil de hacer esto?

Cualquier consejo muy apreciado

0
robintw 10 ene. 2022 a las 13:25

1 respuesta

La mejor respuesta

Puedes hacer eso con:

combined.where(combined.any(dim = 'band'))
1
Thrasy 10 ene. 2022 a las 13:40
Gracias. Después de probar esto, me di cuenta de que necesito hacer algo un poco más complicado: actualicé la pregunta, ¿podría echar un vistazo rápido?
 – 
robintw
10 ene. 2022 a las 13:50
1
Ciertamente no es óptimo, pero creo que puedes hacerlo con el clip: (combined.clip(min = 0, max = cutoff) != combined).any(dim = "band")
 – 
Thrasy
10 ene. 2022 a las 14:03
¡Perfecto, gracias!
 – 
robintw
10 ene. 2022 a las 14:29