2013-04-18 12 views
33
>>> ex=np.arange(30) 
>>> e=np.reshape(ex,[3,10]) 
>>> e 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]]) 
>>> e>15 
array([[False, False, False, False, False, False, False, False, False, 
     False], 
     [False, False, False, False, False, False, True, True, True, 
     True], 
     [ True, True, True, True, True, True, True, True, True, 
     True]], dtype=bool) 

Muszę znaleźć wiersze, które mają prawdziwe lub wierszy w e których wartość ponad 15. Mógłbym iteracji za pomocą pętli for, jednak chciałbym wiedzieć, czy istnieje to sposób, w jaki numpy może to zrobić bardziej efektywnie?numpy dostać indeks, gdzie wartość jest prawdą

Odpowiedz

39

Aby uzyskać numery wierszy, gdzie przynajmniej jeden element jest większy niż 15:

>>> np.where(np.any(e>15, axis=1)) 
(array([1, 2], dtype=int64),) 
16

Można użyć nonzero funkcję. zwraca niezerowe indeksy danego wejścia.

Easy Way

>>> (e > 15).nonzero() 

(array([1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]), array([6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])) 

zobaczyć indeksy bardziej czystsze, użyj transpose metody:

>>> numpy.transpose((e>15).nonzero()) 

[[1 6] 
[1 7] 
[1 8] 
[1 9] 
[2 0] 
... 

Not Bad Way

>>> numpy.nonzero(e > 15) 

(array([1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]), array([6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])) 

lub czysty sposób:

>>> numpy.transpose(numpy.nonzero(e > 15)) 

[[1 6] 
[1 7] 
[1 8] 
[1 9] 
[2 0] 
... 
+3

'np.nonzero()' 'co np.where()' zastosowania [pod maską] (https://docs.scipy.org/doc/numpy/reference/generated/numpy .where.html). – ostrokach

+1

'np.transpose (np.where (board == 0))' jest co działało dla mnie –

Powiązane problemy