es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

xarray proporciona una forma incorrecta del resultado al realizar una operación de “and” a nivel de elemento entre dos arrays de igual tamaño.

Tengo una matriz 2D que cargo desde un archivo NetCDF utilizando xarray, y quiero hacer una especie de detección de bordes comparando los valores de las celdas con los valores de las celdas vecinas. He ideado este código:

import numpy as np
import xarray as xr

d = xr.open_dataset('https://thredds.met.no/thredds/dodsC/barents25kmfiles/Barents-2.5km-ZDEPTHS-his.an.2021112900.nc')

# Comparar valores con celdas vecinas
threshold = 0.7
mask = (d.ice_concentration[0,1:-1,1:-1] < threshold) & (d.ice_concentration[0,1:-1,:-2] > threshold)

# Verificar formas
print((d.ice_concentration[0,1:-1,1:-1] < threshold).shape)
print((d.ice_concentration[0,1:-1,:-2] > threshold).shape)
print(mask.shape)

Salida:

(947, 737)
(947, 737)
(947, 736)

Mi problema aquí es que uso & para realizar una operación and elemento a elemento en dos matrices de igual forma, y sin embargo, el resultado tiene una forma diferente. Supongo que algo mágico relacionado con las dimensiones está sucediendo en segundo plano, de modo que cada celda se compara consigo misma y no con la celda vecina. Esto se sustenta en el hecho de que np.sum(mask) devuelve cero.

Si agrego .values en un par de lugares, obtengo la forma correcta y obtengo el resultado esperado donde np.sum(mask) es un número mayor que cero:

# Comparar valores con celdas vecinas
threshold = 0.7
mask = (d.ice_concentration[0,1:-1,1:-1].values < threshold) & (d.ice_concentration[0,1:-1,:-2].values > threshold)

# Verificar formas
print((d.ice_concentration[0,1:-1,1:-1] < threshold).shape)
print((d.ice_concentration[0,1:-1,:-2] > threshold).shape)
print(mask.shape)

Salida:

(947, 737)
(947, 737)
(947, 737)

¿Es este comportamiento intencional de xarray? Supongo que este comportamiento podría tener sentido si estuviera tratando de comparar diferentes matrices con las mismas dimensiones, pero en este caso no tiene sentido alguno (al menos para mí). ¿O estoy haciendo algo mal?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el comportamiento inesperado se debe al uso del objeto DataArray de xarray en lugar de un arreglo puro de numpy. Cuando se aplican los operadores de comparación a un objeto DataArray, se preservan las dimensiones, lo que resulta en una forma diferente para el arreglo de máscara resultante.

    Para obtener el comportamiento esperado, es posible extraer los datos subyacentes del arreglo de numpy del objeto DataArray utilizando el método .values y aplicar los operadores de comparación directamente a los arreglos de numpy.

    Por lo tanto, agregar .values en los lugares apropiados es una solución válida para el problema, y el arreglo de máscara resultante tiene la forma esperada.

    No está claro si este comportamiento es intencional, pero es posible que siga la filosofía de diseño de xarray de preservar los metadatos (es decir, las dimensiones) siempre que sea posible.

Comments are closed.