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?

Alexandre Holden Daly
źródło

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

Alexandre Holden Daly
źródło
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]
O o
źródło