Website-Suche

Wie man die Methode numpy.where() in Python verwendet


In Python können wir die numpy.where() Funktion verwenden, um Elemente aus einem numpy-Array auszuwählen, basierend auf einer Bedingung.

Nicht nur das, sondern wir können auch einige Operationen an diesen Elementen durchführen, wenn die Bedingung erfüllt ist.

Lass uns anschauen, wie wir diese Funktion nutzen 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/Boolean-Werten).

Es 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 condition 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 condition array([[True, True, False]]) ist und unser Array a=ndarray([[1, 2, 3]]), dann erhalten wir durch Anwendung einer Bedingung auf das Array (a[:, condition]) das Array ndarray([[1 2]]).

import numpy as np

a = np.arange(10)
print(a[a <= 2]) # Will only capture elements <= 2 and ignore others
array([0 1 2])

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 bewahren und keine Elemente aus unserem ursprünglichen Array verlieren wollen? Dafür können wir numpy.where() verwenden.

numpy.where(condition [, x, y])

Wir haben zwei weitere Parameter x und y. Was sind das?

Im Grunde besagt dies, dass wenn die Bedingung für ein Element in unserem Array wahr ist, das neue Array Elemente aus x auswählen wird.

Andernfalls, wenn es falsch ist, werden Elemente aus y entnommen.

Damit wird unser endgültiges Ausgabe-Array ein Array mit Elementen aus x sein, wo condition=True ist, und Elementen aus y, wann immer condition=False ist.

Beachten Sie, dass obwohl x und y optional sind, wenn Sie x angeben, Sie auch y UNBEDINGT angeben müssen. Der Grund dafür ist, dass in diesem Fall die Form des Ausgabearrays mit der Form 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 condition zusammen übertragen werden.

Lassen Sie uns nun einige Beispiele ansehen, um diese Funktion richtig zu verstehen.

Verwendung von Python numpy.where()

Angenommen, wir möchten nur positive Elemente aus einem numpy-Array entnehmen und alle negativen Elemente auf 0 setzen. Lassen Sie uns den Code mit numpy.where() schreiben.

1. Ersetze Elemente mit numpy.where()

Wir werden hier ein zweidimensionales Zufallsarray verwenden und nur die positiven Elemente ausgeben.

import numpy as np

Random initialization of a (2D array)
a = np.random.randn(2, 3)
print(a)

b will be all elements of a whenever the condition holds true (i.e only positive elements)
Otherwise, set it as 0
b = np.where(a > 0, a, 0)

print(b)
[[-1.06455975  0.94589166 -1.94987123]
 [-1.72083344 -0.69813711  1.05448464]]
[[0.         0.94589166 0.        ]
 [0.         0.         1.05448464]]

Wie Sie sehen können, werden jetzt nur die positiven Elemente beibehalten!

2. Verwendung von numpy.where() nur mit einer Bedingung

Es könnte einige Verwirrung bezüglich des obigen Codes geben, da einige von Ihnen vielleicht denken, dass der intuitivere Weg wäre, die Bedingung einfach so zu schreiben:

import random
import numpy as np

a = np.random.randn(2, 3)
b = np.where(a > 0)
print(b)

Wenn Sie den oben genannten Code jetzt mit dieser Änderung ausführen, erhalten Sie eine Ausgabe wie folgt:

(array([0, 1]), array([2, 1]))

Wenn Sie genau hinschauen, ist b jetzt ein Tuple von numpy-Arrays. Und jedes Array ist der Standort eines positiven Elements. Was bedeutet das?

Wann immer wir nur eine Bedingung angeben, ist diese Funktion tatsächlich gleichbedeutend mit np.asarray.nonzero().

In unserem Beispiel wird np.asarray(a > 0) ein boolesches Array zurückgeben, nachdem die Bedingung angewendet wurde, und np.nonzero(arr_like) wird die Indizes der nicht-null Elemente von arr_like zurückgeben. (Siehe diesen Link)

Jetzt werden wir uns ein einfacheres Beispiel ansehen, das uns zeigt, wie flexibel wir mit numpy sein können!

import numpy as np

a = np.arange(10)

b = np.where(a < 5, a, a * 10)

print(a)
print(b)

Ausgabe

[0 1 2 3 4 5 6 7 8 9]
[ 0  1  2  3  4 50 60 70 80 90]

Hier ist die Bedingung a < 5, was das numpy-ähnliche Array [True True True True True False False False False False] ergibt. x ist das Array a und y ist das Array a * 10. Wir wählen also aus, wenn a < 5, und von a * 10, wenn a > 5.

Also, dies transformiert alle Elemente >= 5, indem sie mit 10 multipliziert werden. Das ist tatsächlich das, was wir bekommen!

Übertragung mit numpy.where()

Wenn wir alle condition, x und y Arrays bereitstellen, wird NumPy sie zusammen broadcasten.

import numpy as np

a = np.arange(12).reshape(3, 4)

b = np.arange(4).reshape(1, 4)

print(a)
print(b)

Broadcasts (a < 5, a, and b * 10)
of shape (3, 4), (3, 4) and (1, 4)
c = np.where(a < 5, a, b * 10)

print(c)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[0 1 2 3]]
[[ 0  1  2  3]
 [ 4 10 20 30]
 [ 0 10 20 30]]

Nochmals, hier wird die Ausgabe basierend auf der Bedingung ausgewählt, sodass alle Elemente, aber hier wird b auf die Form von a übertragen. (Eine seiner Dimensionen hat nur ein Element, sodass es während des Broadcastings keine Fehler geben wird.)

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 Broadcast-Array auswählen.

Die Form der Ausgabe ist also dieselbe wie die Form von a.

Schlussfolgerung

In diesem Artikel haben wir gelernt, wie wir die Python numpy.where() Funktion verwenden können, um Arrays basierend auf einem anderen Bedingungsarray auszuwählen.

Referenzen

  • SciPy-Dokumentation zur Python-Funktion numpy.where()