numpy.where () szczegółowe wyjaśnienie / przykłady krok po kroku [zamknięte]


168

Mam problem ze zrozumieniem numpy.where()pomimo przeczytania dokumentu , tego i tego innego postu .

Czy ktoś może podać przykłady z komentarzami krok po kroku z tablicami 1D i 2D?

Odpowiedzi:


271

Po jakimś czasie się zabawiłem, zorientowałem się, co się dzieje i zamieszczam je tutaj, mając nadzieję, że pomoże to innym.

Intuicyjnie np.wherejest to jak pytanie „ powiedz mi, gdzie w tej tablicy wpisy spełniają dany warunek ”.

>>> 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

Można go również użyć do pobrania wpisów w tablicy, które spełniają warunek:

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

Kiedy ajest tablicą 2d, np.where()zwraca tablicę idx wierszy i tablicę idx kolumn:

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

Podobnie jak w przypadku 1d, możemy użyć np.where()do uzyskania wpisów w tablicy 2d, które spełniają warunek:

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

tablica ([9])


Zauważ, że gdy awynosi 1d, np.where()nadal zwraca tablicę idx wierszy i tablicę idx kolumn, ale kolumny mają długość 1, więc ostatnia jest pustą tablicą.


10
Walczyłem ze zrozumieniem np.where podczas używania na 2d, dopóki nie znalazłem odpowiedzi „Kiedy a jest tablicą 2d, np.where () zwraca tablicę wierszy idx i tablicę col idx:”. Dziękuję za to.
bencampbell_14

1
Czułem się całkiem głupio po przeczytaniu tego dokumentu trzy razy i nadal nie rozwiązałem zagadki np.where(2d_array), dzięki za wyjaśnienie tego! Powinieneś zaakceptować własną odpowiedź. e: Och, jest zamknięte. Cóż, nie powinno być
smcs

5
Szkoda, że ​​to zostało zamknięte. Chciałbym jednak dodać jeszcze jedną cechę np.wheretej kompletnej odpowiedzi. Funkcja może także wybierać elementy z tablicy xiy w zależności od warunku. Ograniczona przestrzeń w tym komentarzu, ale zobacz: 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]]))powróci array([[4, 8, 6], [9, 2, 1]]). Zwróć uwagę, które elementy x i y są wybierane w zależności od Prawda / Fałsz
piccolo

Wyjaśnienie podane w tej odpowiedzi jest tylko szczególnym przypadkiem np. Gdzie. Zgodnie z dokumentacją, gdy conditionjest dostępna, funkcja ta jest skrótem dla np.asarray(condition).nonzero().
Lenny

19

Tutaj jest trochę więcej zabawy. Zauważyłem, że bardzo często NumPy robi dokładnie to, czego bym sobie życzył - czasami szybciej jest po prostu próbować rzeczy niż czytać dokumenty. Właściwie najlepsze jest połączenie obu.

Myślę, że twoja odpowiedź jest w porządku (i możesz ją zaakceptować, jeśli chcesz). To jest po prostu „ekstra”.

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

daje:

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

... ale:

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

daje:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.