Tengo el siguiente DataArray
arr = xr.DataArray([[0.33, 0.25],[0.55, 0.60],[0.85, 0.71],[0.92,0.85],[1.50,0.96],[2.5,1.1]],[('x',[0.25,0.5,0.75,1.0,1.25,1.5]),('y',[1,2])])
Esto da el siguiente resultado
<xarray.DataArray (x: 6, y: 2)>
array([[0.33, 0.25],
[0.55, 0.6 ],
[0.85, 0.71],
[0.92, 0.85],
[1.5 , 0.96],
[2.5 , 1.1 ]])
Coordinates:
* x (x) float64 0.25 0.5 0.75 1.0 1.25 1.5
* y (y) int32 1 2
o ordenados a continuación con x y salida (z) uno al lado del otro para mayor comodidad.
x z (y=1) z(y=2)
0.25 0.33 0.25
0.50 0.55 0.60
0.75 0.85 0.71
1.00 0.92 0.85
1.25 1.50 0.96
1.50 2.50 1.10
Los datos que tengo son el resultado de varios valores de entrada. Uno de ellos es el valor x. Hay varias otras dimensiones (como y) para otros valores de entrada. Quiero saber cuándo mi valor de salida (z) está creciendo a más de 1.00, manteniendo las otras dimensiones fijas y variando el valor de x. En el ejemplo bidimensional anterior, me gustaría obtener la respuesta [1.03 1.32]. Porque un valor de 1.03 para x me dará 1.00 para z cuando y = 1 y un valor de 1.32 para x me dará 1.00 para z cuando y = 2.
editar: Dado que la salida z crecerá con el aumento de x, solo hay un punto donde z tendrá 1.0 como salida.
¿Hay alguna manera eficiente de lograr esto con xarray? Mi tabla actual es mucho más grande y tiene 4 entradas (dimensiones).
¡Gracias por cualquier ayuda!
fuente
El problema que tuve con la respuesta de jojo es que es difícil expandirlo en muchas dimensiones y mantener la estructura de rayos. Por lo tanto, decidí profundizar en esto. Utilicé algunas ideas del código de jojo para responder a continuación.
Hago dos matrices, una con la condición de que los valores son más pequeños de lo que busco y otra con la condición de que deben ser más grandes. Cambio el segundo en la dirección x por menos 1. Ahora los combino en una fórmula de interpolación lineal normal. Las dos matrices solo tienen valores superpuestos en el 'borde' de la condición. Si no se desplaza por -1, ningún valor se superpondría. En la línea final sumo sobre la dirección x y como todos los demás valores lo son
NaN
, extraigo el valor correcto y elimino la dirección x del DataArray en el proceso.Tengo algunos inconvenientes con mi código. El código solo funciona si M0 y M1 encuentran un valor que cumpla la condición. De lo contrario, todos los valores de esa fila se establecerán en
NaN
. Para evitar problemas con M0, decidí que los valores de x comenzaran en 0 ya que mi valor objetivo siempre es mayor que 0. Para evitar problemas con M1, elijo mis valores de x lo suficientemente grandes para que sepa que mis valores están ahí . Naturalmente, estas no son soluciones ideales y pueden romper el código. Si tengo un poco más de experiencia con xarray y python, podría volver a escribir. En resumen, tengo los siguientes elementos que me gustaría resolver:fuente