2011-01-03 15 views

Odpowiedz

122

numpy.where() jest moim ulubionym.

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8]) 
>>> numpy.where(x == 0)[0] 
array([1, 3, 5]) 
+7

Próbuję pamiętać o Pythonie. Dlaczego 'where()' zwraca krotkę? 'numpy.where (x == 0) [1]' jest poza zakresem. do czego jest sprzężona tablica wskaźników? – Rhubarb

+0

@Zhubarb - Większość zastosowań indeces to krotki - 'np.zeros ((3,))' na przykład do utworzenia wektora 3-długiego. Podejrzewam, że jest to łatwe do analizowania params. W przeciwnym razie coś takiego jak 'np.zeros (3,0, dtype = 'int16')' versus 'np.zeros (3,3,3, dtype = 'int16')' byłoby denerwujące do wdrożenia. – mtrw

+3

no. 'where' zwraca krotkę' ndarray's, z których każdy odpowiada wymiarowi danych wejściowych. w tym przypadku wejście jest tablicą, więc wyjście jest '' 1-krotnością'. Jeśli x byłaby macierzą, byłaby to "2-krotna", i tak na –

16

Można wyszukiwać każdych warunkach skalarnego z:

>>> a = np.asarray([0,1,2,3,4]) 
>>> a == 0 # or whatver 
array([ True, False, False, False, False], dtype=bool) 

Który będzie oddać tablicę jako logiczną maski warunku.

+0

Możesz użyć tego, aby uzyskać dostęp do elementów zerowych: 'a [a == 0] = epsilon' –

1

Jeśli pracujesz z jednowymiarowej tablicy znajduje się cukier syntaktyczny:

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8]) 
>>> numpy.flatnonzero(x == 0) 
array([1, 3, 5]) 
+0

To działa dobrze tak długo, jak mam tylko jeden warunek. Co jeśli chcę wyszukać "x == numpy.array (0,2,7)"? Wynik powinien być tablicą ([1,2,3,5,9]). Ale jak mogę to zdobyć? – MoTSCHIGGE

+0

Można to zrobić za pomocą: 'numpy.flatnonzero (numpy.logical_or (numpy.logical_or (x == 0, x == 2), x == 7))' – Dusch

6

Można również użyć nonzero() używając go na logicznej maski warunku, ponieważ False jest również rodzajem zero.

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8]) 

>>> x==0 
array([False, True, False, True, False, True, False, False, False, False, False], dtype=bool) 

>>> numpy.nonzero(x==0)[0] 
array([1, 3, 5]) 

To robi dokładnie tak samo jak sposób mtrw „s, ale jest to bardziej związane z pytaniem;)

0
import numpy as np 

x = np.array([1,0,2,3,6]) 
non_zero_arr = np.extract(x>0,x) 

min_index = np.amin(non_zero_arr) 
min_value = np.argmin(non_zero_arr) 
11

Jest np.argwhere,

import numpy as np 
arr = np.array([[1,2,3], [0, 1, 0], [7, 0, 2]]) 
np.argwhere(arr == 0) 

która zwraca wszystkie znalezione indeksy jako wiersze:

array([[1, 0], # Indices of the first zero 
     [1, 2], # Indices of the second zero 
     [2, 1]], # Indices of the third zero 
     dtype=int64) 
Powiązane problemy