Extraer valores en ubicaciones puntuales de un DataArray de xarray y obtener todos los demás valores por separado.
Tengo un DataArray xarray de la siguiente manera:
import xarray as xr
import numpy as np
da = xr.DataArray(np.arange(25).reshape(5, 5), dims=['x', 'y'], coords={'x': np.arange(5), 'y': np.arange(5)})
Se ve así:
Quiero seleccionar los valores del DataArray que están más cerca de ciertos puntos de coordenadas x, y que tengo.
Para hacer esto, puedo poner esas coordenadas de puntos en DataArrays ellos mismos e indexar usando esos:
x_coords = xr.DataArray([1.2, 3.6, 4.9])
y_coords = xr.DataArray([2.2, 0.7, 4.3])
da.sel(x=x_coords, y=y_coords, method='nearest')
Esto da como resultado esperado [7, 21, 24].
Sin embargo, ahora quiero obtener los elementos ‘otros’ del array. Es decir, aquellos que están en celdas que no son las celdas más cercanas a las ubicaciones de los puntos que he dado. En este caso, esto sería todos los números del 0 al 24 excluyendo 7, 21 y 24. Sin embargo, en mi array real, los valores no son únicos como este.
¿Cómo puedo obtener estos valores?
Me pregunté si podría hacer algo usando conjuntos, pero tendría que tratar las coordenadas x e y juntas, ya que las coordenadas vienen en pares, y no pude entender cómo hacer esto.
Si es necesario, estoy contento con una solución solo de numpy, pero preferiría una solución pura de xarray.
davy.ai
Una forma de obtener los “otros” elementos del array es crear una nueva DataArray que contenga todas las ubicaciones de las celdas, y luego usar la función
setdiff1d
de numpy para encontrar qué celdas no son las más cercanas a los puntos dados. Aquí tienes un ejemplo de implementación:La DataArray
not_nearest
tiene el valor 1 para todas las celdas que no son las más cercanas a ninguno de los puntos dados, y NaN para el resto. Al empilar las coordenadasx
ey
en una nueva dimensióncell
, podemos utilizar la funcióndropna
para mantener solo las celdas donde el valor sea 1.Finalmente, podemos utilizar la función
flatten
de numpy para convertir la DataArray original en un array unidimensional, y utilizar el índicenot_nearest.index
para obtener los valores de las “otras” celdas. Ten en cuenta que los valores se devuelven en el orden del array aplanado, no en el orden del array original.