In Python können wir die Funktion numpy.where() verwenden, um Elemente aus einem NumPy-Array basierend auf einer Bedingung auszuwählen.
Nicht nur das, sondern wir können auch einige Operationen auf diesen Elementen ausführen, wenn die Bedingung erfüllt ist.
Lassen Sie uns anschauen, wie wir diese Funktion verwenden können, anhand einiger illustrativer Beispiele!
Syntax von Python numpy.where()
Diese Funktion akzeptiert ein numpy-ähnliches Array (z. B. ein NumPy-Array von Ganzzahlen/Booleschen Werten).
Sie gibt ein neues NumPy-Array zurück, nachdem es basierend auf einer Bedingung gefiltert wurde, die ein numpy-ähnliches Array von booleschen Werten ist.
Zum Beispiel kann Bedingung
den Wert array([[True, True, True]])
annehmen, was ein numpy-ähnliches Boolesches Array ist. (Standardmäßig unterstützt NumPy nur numerische Werte, aber wir können sie auch in bool
umwandeln)
Zum Beispiel, wenn Bedingung
array([[True, True, False]])
ist und unser Array a = ndarray([[1, 2, 3]])
ist, erhalten wir bei Anwendung einer Bedingung auf das Array (a[:, Bedingung]
) das Array ndarray([[1 2]])
.
Ausgabe
HINWEIS: Die gleiche Bedingung kann auch als a <= 2 dargestellt werden. Dies ist das empfohlene Format für das Bedingungsarray, da es sehr mühsam ist, es als boolesches Array zu schreiben
Aber was ist, wenn wir die Dimension des Ergebnisses beibehalten und keine Elemente aus unserem ursprünglichen Array verlieren möchten? Dafür können wir numpy.where() verwenden.
Wir haben zwei weitere Parameter x
und y
. Was sind diese?
Grundsätzlich besagt dies, dass, wenn Bedingung
für ein Element in unserem Array wahr ist, das neue Array Elemente aus x
wählen wird.
Andernfalls, wenn es falsch ist, werden Elemente aus y
übernommen.
Mit diesem Ansatz wird unser endgültiges Ausgabearray ein Array mit Elementen aus x
sein, wo immer Bedingung = True
ist, und Elementen aus y
, wenn Bedingung = False
ist.
Beachten Sie, dass obwohl x
und y
optional sind, wenn Sie x
angeben, Sie MÜSSEN auch y
angeben. Dies liegt daran, dass in diesem Fall die Form des Ausgabearrays mit der des Eingabearrays übereinstimmen muss.
HINWEIS: Die gleiche Logik gilt sowohl für eindimensionale als auch für mehrdimensionale Arrays. In beiden Fällen filtern wir basierend auf der Bedingung. Denken Sie auch daran, dass die Formen von x
, y
und Bedingung
gemeinsam übertragen werden.
Jetzt schauen wir uns einige Beispiele an, um diese Funktion richtig zu verstehen.
Verwendung von Python numpy.where()
Angenommen, wir möchten nur positive Elemente aus einem numpy-Array nehmen und alle negativen Elemente auf 0 setzen. Schreiben wir den Code mit numpy.where()
.
1. Ersetzen von Elementen mit numpy.where()
Hier verwenden wir ein zweidimensionales Zufallsarray und geben nur die positiven Elemente aus.
Mögliche Ausgabe
Wie Sie sehen können, sind jetzt nur die positiven Elemente erhalten geblieben!
2. Verwendung von numpy.where() mit nur einer Bedingung
Es kann einige Verwirrung bezüglich des obigen Codes geben, da einige von Ihnen vielleicht denken, dass der intuitivere Weg einfach darin besteht, die Bedingung so zu schreiben:
Wenn Sie jetzt versuchen, den obigen Code mit dieser Änderung auszuführen, erhalten Sie eine Ausgabe wie diese:
Wenn Sie genau hinsehen, ist b
jetzt ein Tupel von Numpy-Arrays. Und jedes Array ist der Ort eines positiven Elements. Was bedeutet das?
Immer wenn wir nur eine Bedingung angeben, ist diese Funktion tatsächlich äquivalent zu np.asarray.nonzero()
.
In unserem Beispiel wird np.asarray(a > 0)
nach Anwendung der Bedingung ein boolesches Array zurückgeben, und np.nonzero(arr_like)
wird die Indizes der Nicht-Null-Elemente von arr_like
zurückgeben. (Siehe diesen Link)
Also werden wir uns jetzt ein einfacheres Beispiel ansehen, das uns zeigt, wie flexibel wir mit Numpy sein können!
Ausgabe
Hier ist die Bedingung a < 5
, die das Numpy-ähnliche Array [True True True True True False False False False False]
sein wird, x
ist das Array a
und y
ist das Array a * 10
. Also wählen wir aus, nur wenn a < 5
, und aus a * 10
, wenn a > 5
.
Das heißt, dies verwandelt alle Elemente >= 5 durch Multiplikation mit 10. Das ist tatsächlich das, was wir bekommen!
Rundfunk mit numpy.where()
Wenn wir alle Arrays condition
, x
und y
bereitstellen, wird numpy sie zusammen übertragen.
Ausgabe
Hier wird die Ausgabe wieder basierend auf der Bedingung ausgewählt, sodass alle Elemente, aber hier b
, auf die Form von a
übertragen werden. (Eine seiner Dimensionen hat nur ein Element, daher treten beim Übertragen keine Fehler auf)
Also wird b
jetzt zu [[0 1 2 3] [0 1 2 3] [0 1 2 3]]
, und jetzt können wir sogar Elemente aus diesem übertragenen Array auswählen.
Die Form der Ausgabe ist also dieselbe wie die Form von a
.
Fazit
In diesem Artikel haben wir gelernt, wie wir die Python-Funktion numpy.where() verwenden können, um Arrays basierend auf einem anderen Bedingungsarray auszuwählen.
Referenzen
- SciPy-Dokumentation zur Python numpy.where() Funktion
Source:
https://www.digitalocean.com/community/tutorials/python-numpy-where