numpy.where () detaillierte, schrittweise Erklärung / Beispiele [geschlossen]

168

Ich habe Probleme beim richtigen Verstehen, numpy.where()obwohl ich das Dokument , diesen Beitrag und diesen anderen Beitrag gelesen habe .

Kann jemand Schritt für Schritt kommentierte Beispiele mit 1D- und 2D-Arrays bereitstellen?

Alexandre Holden Daly
quelle

Antworten:

271

Nachdem ich eine Weile herumgespielt hatte, fand ich die Dinge heraus und poste sie hier in der Hoffnung, dass es anderen helfen wird.

Intuitiv np.whereist das wie die Frage " Sag mir, wo in diesem Array Einträge eine bestimmte Bedingung erfüllen ".

>>> a = np.arange(5,10)
>>> np.where(a < 8)       # tell me where in a, entries are < 8
(array([0, 1, 2]),)       # answer: entries indexed by 0, 1, 2

Es kann auch verwendet werden, um Einträge in einem Array abzurufen, die die Bedingung erfüllen:

>>> a[np.where(a < 8)] 
array([5, 6, 7])          # selects from a entries 0, 1, 2

Wenn aes sich um ein 2D-Array handelt, wird np.where()ein Array mit Zeilen-IDX und ein Array mit Spalten-IDX zurückgegeben:

>>> a = np.arange(4,10).reshape(2,3)
array([[4, 5, 6],
       [7, 8, 9]])
>>> np.where(a > 8)
(array(1), array(2))

Wie im 1d-Fall können wir np.where()Einträge im 2d-Array abrufen, die die Bedingung erfüllen:

>>> a[np.where(a > 8)] # selects from a entries 0, 1, 2

Array ([9])


Beachten Sie, dass bei a1d np.where()immer noch ein Array von Zeilen-IDX und ein Array von Spalten-IDX zurückgegeben wird, die Spalten jedoch die Länge 1 haben, sodass letzteres ein leeres Array ist.

Alexandre Holden Daly
quelle
10
Ich hatte Probleme, np.where zu verstehen, wenn es auf 2d verwendet wurde, bis ich Ihre Antwort fand: "Wenn a ein 2d-Array ist, gibt np.where () ein Array von Zeilen-IDXs und ein Array von Col-IDXs zurück:". Dank dafür.
Bencampbell_14
1
Ich fühlte mich ziemlich dumm, nachdem ich den Doc dreimal gelesen und das Rätsel immer noch nicht gelöst hatte np.where(2d_array), danke, dass du das geklärt hast! Sie sollten Ihre eigene Antwort akzeptieren. e: Oh, es ist geschlossen. Nun, es sollte nicht sein
smcs
5
Es ist eine Schande, dass dies geschlossen wurde. Ich möchte np.wheredieser ansonsten vollständigen Antwort jedoch noch eine weitere Funktion hinzufügen . Die Funktion kann je nach Bedingung auch Elemente aus dem x- und y-Array auswählen. Begrenzter Platz in diesem Kommentar, aber siehe: np.where(np.array([[False,False,True], [True,False,False]]), np.array([[8,2,6], [9,5,0]]), np.array([[4,8,7], [3,2,1]]))wird zurückkehren array([[4, 8, 6], [9, 2, 1]]). Beachten Sie, welche Elemente von x und y abhängig von Richtig / Falsch ausgewählt werden
piccolo
Die Erklärung in dieser Antwort ist nur ein Sonderfall von np.where. Laut Dokumentation conditionist diese Funktion eine Abkürzung für Wenn nur bereitgestellt wird np.asarray(condition).nonzero().
Lenny
19

Hier macht ein bisschen mehr Spaß. Ich habe festgestellt, dass NumPy sehr oft genau das tut, was ich mir gewünscht habe - manchmal ist es für mich schneller, Dinge einfach auszuprobieren, als die Dokumente zu lesen. Eigentlich ist eine Mischung aus beiden am besten.

Ich denke, Ihre Antwort ist in Ordnung (und es ist in Ordnung, sie zu akzeptieren, wenn Sie möchten). Dies ist nur "extra".

import numpy as np

a = np.arange(4,10).reshape(2,3)

wh = np.where(a>7)
gt = a>7
x  = np.where(gt)

print "wh: ", wh
print "gt: ", gt
print "x:  ", x

gibt:

wh:  (array([1, 1]), array([1, 2]))
gt:  [[False False False]
      [False  True  True]]
x:   (array([1, 1]), array([1, 2]))

... aber:

print "a[wh]: ", a[wh]
print "a[gt]  ", a[gt]
print "a[x]:  ", a[x]

gibt:

a[wh]:  [8 9]
a[gt]   [8 9]
a[x]:   [8 9]
uhoh
quelle