Skip to content

numpy.where(): Elemente abhängig von Bedingungen manipulieren

Python

Mit numpy.where can SIE Elemente des NumPy-Arrays ndarray ersetzen oder manipulieren, sterben sterben Bedingungen erfüllen.

Dieser Artikel hat folgenden Inhalt.

  • Übersicht über np.where()
  • np.where() mit mehreren Bedingungen
  • Ersetzen SIE sterben Elemente, sterben sterben Bedingung erfüllen
  • Bearbeiten Sie sterben Elemente, sterben sterben Bedingung erfüllen
  • Holen Sie sich sterben Indizes der Elemente, sterben sterben Bedingung erfüllen

Wenn SIE Elemente, Zeilen und Spalten extrahieren oder löschen möchten, sterben sterben Bedingungen erfüllen, lesen Sie den following Artikel.

Übersicht über np.where()

numpy.where(condition[, x, y]) Gibt
Elemente zurück, entweder von x oder y, je nach Bedingung.
Wenn nur Bedingung angegeben ist, gebe condition.nonzero() zurück.
numpy.where – NumPy v1.14 Handbuch

np.where() ist eine Funktion, die ndarray zurückgibt, was x ist, wenn die Bedingung wahr ist, und y, wenn sie falsch ist. x, y und Bedingung müssen in derselben Form übertragbar sein.

If x undy weggelassen Werden, wird index zurückgegeben. Einzelheiten werden später beschrieben.

import numpy as np

a = np.arange(9).reshape((3, 3))
print(a)
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]

print(np.where(a < 4, -1, 100))
# [[ -1  -1  -1]
#  [ -1 100 100]
#  [100 100 100]]

Sie können das boolesche ndarray durch einen bedingten Ausdruck erhalten, der ndarray enthält, ohne np.where() zu verwenden.

print(a < 4)
# [[ True  True  True]
#  [ True False False]
#  [False False False]]

np.where() mit mehreren Bedingungen

Sie können mehrere Bedingungen mit np.where() anwenden, indem Sie jeden bedingten Ausdruck in () einschließen und & oder | verwenden.

print(np.where((a > 2) & (a < 6), -1, 100))
# [[100 100 100]
#  [ -1  -1  -1]
#  [100 100 100]]

print(np.where((a > 2) & (a < 6) | (a == 7), -1, 100))
# [[100 100 100]
#  [ -1  -1  -1]
#  [100  -1 100]]

Lesen Sie den following Artikel, warum Sie &, | verwenden müssen anstelle von und, oder und warum Klammern notwendig sind.

Selbst bei mehreren Bedingungen ist es nicht erforderlich, np.where() zu verwenden, um das boolesche ndarray zu erhalten.

print((a > 2) & (a < 6))
# [[False False False]
#  [ True  True  True]
#  [False False False]]

print((a > 2) & (a < 6) | (a == 7))
# [[False False False]
#  [ True  True  True]
#  [False  True False]]

Ersetzen SIE sterben Elemente, sterben sterben Bedingung erfüllen

Es ist auch möglich, Elemente mit einem bestimmten Wert nur dann zu ersetzen, wenn die Bedingung erfüllt oder nicht erfüllt ist.

Wenn Sie das ursprüngliche ndarray an x ​​und y übergeben, wird der ursprüngliche Wert so verwendet, wie er ist.

print(np.where(a < 4, -1, a))
# [[-1 -1 -1]
#  [-1  4  5]
#  [ 6  7  8]]

print(np.where(a < 4, a, 100))
# [[  0   1   2]
#  [  3 100 100]
#  [100 100 100]]

Beachten Sie, dass np.where() ein neues ndarray zurückgibt und das ursprüngliche ndarray unverändert bleibt.

a_org = np.arange(9).reshape((3, 3))
print(a_org)
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]

a_new = np.where(a_org < 4, -1, a_org)
print(a_new)
# [[-1 -1 -1]
#  [-1  4  5]
#  [ 6  7  8]]

print(a_org)
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]

Wenn Sie das ursprüngliche Ndarray selbst aktualisieren möchten, können Sie folgendes schreiben:

a_org[a_org < 4] = -1
print(a_org)
# [[-1 -1 -1]
#  [-1  4  5]
#  [ 6  7  8]]

Bearbeiten Sie sterben Elemente, sterben sterben Bedingung erfüllen

Anstelle des ursprünglichen ndarray can SIE auch Ausdrücke für x und y angeben.

print(np.where(a < 4, a * 10, a))
# [[ 0 10 20]
#  [30  4  5]
#  [ 6  7  8]]

Holen Sie sich sterben Indizes der Elemente, sterben sterben Bedingung erfüllen

Wenn x und y weggelassen Werden, Werden die Indizes der Elemente zurückgegeben, sterben die Bedingung erfüllen.

Ein Tupel eines Arrays von Indizes (Zeilennummer, Spaltennummer), das sterben Bedingung für jede Dimension (Zeile, Spalte) erfüllt, wird zurückgegeben.

print(np.where(a < 4))
# (array([0, 0, 0, 1]), array([0, 1, 2, 0]))

print(type(np.where(a < 4)))
# <class 'tuple'>

In diesem Fall bedeutet dies, dass die Elemente bei [0, 0], [0, 1], [0, 2] und [1, 0] die Bedingung erfüllen.

Es ist auch möglich, eine Liste aller Koordinaten zu erhalten, indem Sie list(), zip() und * wie folgt verwenden:

print(list(zip(*np.where(a < 4))))
# [(0, 0), (0, 1), (0, 2), (1, 0)]

Dasselbe gilt für mehrdimensionale Arrays mit drei oder mehr Dimensionen.

a_3d = np.arange(24).reshape(2, 3, 4)
print(a_3d)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
# 
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

print(np.where(a_3d < 5))
# (array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 1]), array([0, 1, 2, 3, 0]))

print(list(zip(*np.where(a_3d < 5))))
# [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 0)]

Gleiches gilt für eindimensionale Arrays. Beachten Sie, dass bei Verwendung von list(), zip() und * each Element in der Resultierenden Liste ein Tupel mit Einem Element IST.

a_1d = np.arange(6)
print(a_1d)
# [0 1 2 3 4 5]

print(np.where(a_1d < 3))
# (array([0, 1, 2]),)

print(list(zip(*np.where(a_1d < 3))))
# [(0,), (1,), (2,)]

Wenn Sie wissen, dass es eindimensional ist, können Sie das erste Element des Ergebnisses von np.where() unverändert verwenden. In diesem Fall handelt es sich um ein ndarray mit einer ganzen Zahl int als Element, nicht um ein Tupel mit einem Element. Wenn Sie in eine Liste konvertieren möchten, verwenden Sie tolist().

print(np.where(a_1d < 3)[0])
# [0 1 2]

print(np.where(a_1d < 3)[0].tolist())
# [0, 1, 2]

Sie können die Anzahl der Dimensionen mit dem ndim-Attribut abrufen.