Ich habe ein folgendes 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])])
Dies ergibt die folgende Ausgabe
<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
oder der Einfachheit halber unten mit x und Ausgabe (z) nebeneinander sortiert.
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
Die Daten, die ich habe, sind das Ergebnis mehrerer Eingabewerte. Einer davon ist der x-Wert. Es gibt mehrere andere Dimensionen (z. B. y) für andere Eingabewerte. Ich möchte wissen, wann mein Ausgabewert (z) größer als 1,00 wird, wobei die anderen Dimensionen festgehalten werden und der x-Wert variiert wird. Im obigen zweidimensionalen Beispiel möchte ich die Antwort [1.03 1.32] erhalten. Weil ein Wert von 1,03 für x 1,00 für z ergibt, wenn y = 1 ist, und ein Wert von 1,32 für x 1,00 für z ergibt, wenn y = 2 ist.
Bearbeiten: Da die Ausgabe z mit zunehmendem x wächst, gibt es nur einen Punkt, an dem z 1.0 als Ausgabe hat.
Gibt es eine effiziente Möglichkeit, dies mit xarray zu erreichen? Meine eigentliche Tabelle ist viel größer und hat 4 Eingänge (Dimensionen).
Vielen Dank für jede Hilfe!
quelle
Das Problem, das ich mit Jojos Antwort hatte, ist, dass es schwierig ist, es in vielen Dimensionen zu erweitern und die Röntgenstruktur beizubehalten. Daher habe ich mich entschlossen, dies weiter zu untersuchen. Ich habe einige Ideen aus Jojos Code verwendet, um die folgende Antwort zu geben.
Ich erstelle zwei Arrays, eines mit der Bedingung, dass die Werte kleiner sind als das, wonach ich suche, und eines mit der Bedingung, dass sie größer sein müssen. Ich verschiebe die zweite in x-Richtung um minus 1. Jetzt kombiniere ich sie in einer normalen linearen Interpolationsformel. Die beiden Arrays haben nur Werte, die sich am Rand der Bedingung überlappen. Wenn nicht um -1 verschoben, würden sich keine Werte überlappen. In der letzten Zeile summiere ich über die x-Richtung und da alle anderen Werte sind
NaN
, extrahiere ich den korrekten Wert und entferne dabei die x-Richtung aus dem DataArray.Ich habe einige Nachteile mit meinem Code. Der Code funktioniert nur, wenn M0 und M1 einen Wert finden, der die Bedingung erfüllt. Andernfalls werden alle Werte in dieser Zeile auf gesetzt
NaN
. Um Probleme mit M0 zu vermeiden, habe ich beschlossen, die x-Werte nur bei 0 zu beginnen, da mein Zielwert immer größer als 0 ist. Um Probleme mit M1 zu vermeiden, wähle ich meine Werte für x groß genug, damit ich weiß, dass meine Werte dort sind . Dies sind natürlich keine idealen Lösungen und können den Code brechen. Wenn ich etwas mehr Erfahrung mit Xarray und Python habe, könnte ich umschreiben. Zusammenfassend habe ich folgende Punkte, die ich lösen möchte:quelle