2016-01-07 10 views
37

Mam problemy z prawidłowym zrozumieniem numpy.where() pomimo przeczytania the doc, this post i this other post.numpy.where() szczegółowy opis krok po kroku/przykłady

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

+3

Należy precyzyjnie * co * ty nie rozumiesz. Na pewno nie chcesz, abyśmy powtarzali wszystko od dokumentów. – timgeb

+9

Nie wiem, dlaczego ludzie obrażają się z takimi pytaniami i zamykają je. Ale wiedz, że to pomogło wielu ludziom. – deadcode

Odpowiedz

79

Po błądzeniu przez chwilę zorientowałem się, i zamieszczam je tutaj, mając nadzieję, że pomoże to innym.

Intuicyjnie, np.where jest 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 

To może być również używany, aby wpisy w tablicy, które spełniają warunek:

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

Gdy jest 2D array, np.where() zwraca tablicę wierszy IDX-tych, a tablicą col idx to:

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

tak, że jak w przypadku 1d, możemy użyć np.where() t O się wpisy w tablicy 2D, które spełniają warunek:

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

Array ([9])


zwrócenie uwagi, że a jest 1d np.where() nadal powraca tablicę IDX Row i tablicę col idx, ale kolumny mają długość 1, więc ostatnia jest pustą tablicą.

+3

Walczyłem o zrozumienie np.where gdy używano go na 2d aż znalazłem twoją odpowiedź "Kiedy jest tablicą 2d, np.where() zwraca tablicę idxów rzędu i tablicę col idx's:". Dziękuję za to. –

+0

Dziękuję Alexandre. Twoje komentarze pomogły, ja też zmagałem się ze zrozumieniem. – anonnoir

+0

Po przeczytaniu dokumentu trzy razy poczułem się głupio i nadal nie rozwiązałem zagadki 'np.where (2d_array)', dziękuję za wyjaśnienie! Powinieneś zaakceptować własną odpowiedź. e: Oh, jest zamknięte. Cóż, nie powinno tak być – speedymcs

1

Oto trochę więcej zabawy. Odkryłem, że bardzo często NumPy robi dokładnie to, co chciałbym, aby zrobił - czasami szybciej jest po prostu wypróbować rzeczy niż czytać dokumenty. Właściwie najlepiej jest połączyć oba.

Myślę, że twoja odpowiedź jest w porządku (i można ją zaakceptować, jeśli chcesz). To tylko "dodatkowe".

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]