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?
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:
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.where
jest 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 a
jest 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 a
wynosi 1d, np.where()
nadal zwraca tablicę idx wierszy i tablicę idx kolumn, ale kolumny mają długość 1, więc ostatnia jest pustą tablicą.
np.where(2d_array)
, dzięki za wyjaśnienie tego! Powinieneś zaakceptować własną odpowiedź. e: Och, jest zamknięte. Cóż, nie powinno być
np.where
tej 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
condition
jest dostępna, funkcja ta jest skrótem dla np.asarray(condition).nonzero()
.
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]