2011-01-03 2 views

ответ

122

numpy.where() - мой любимый.

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

Я пытаюсь вспомнить Python. Почему 'where()' возвращает кортеж? 'numpy.where (x == 0) [1]' выходит за пределы. что такое индексный массив, связанный с этим? – Rhubarb

+0

@ Zhubarb - Большинство применений индексов - это кортежи - 'np.zeros ((3,))', например, для создания трехмерного вектора. Я подозреваю, что это легко сделать синтаксический анализ параметров. В противном случае что-то вроде 'np.zeros (3,0, dtype = 'int16')' versus 'np.zeros (3,3,3, dtype = 'int16')' будет раздражать для реализации. – mtrw

+3

№. 'where' возвращает кортеж' ndarray', каждый из которых соответствует размеру ввода. в этом случае вход представляет собой массив, поэтому выход представляет собой «1-кортеж». Если x была матрицей, это было бы «2-tuple» и т. Д. –

16

Вы можете осуществлять поиск любого скалярного условия с:

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

Который воздаст массив как булевой маска состояния.

+0

Вы можете использовать это для доступа к нулевым элементам: 'a [a == 0] = epsilon' –

1

Если вы работаете с одномерным массивом существует синтаксический сахар:

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

Это работает отлично, пока у меня есть только одно условие. Что делать, если я хочу найти «x == numpy.array (0,2,7)»? Результатом должен быть массив ([1,2,3,5,9]). Но как я могу это получить? – MoTSCHIGGE

+0

Вы можете сделать это с помощью: 'numpy.flatnonzero (numpy.logical_or (numpy.logical_or (x == 0, x == 2), x == 7))' – Dusch

6

Вы также можете использовать nonzero(), используя его на булевую маске состояния, потому что False это тоже своего рода нуль.

>>> 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]) 

Это делает точно так же, как и путь mtrw «s, но в большей степени связана с вопросом;)

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

Существует np.argwhere,

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

, который возвращает все найденные индексы в строках:

array([[1, 0], # Indices of the first zero 
     [1, 2], # Indices of the second zero 
     [2, 1]], # Indices of the third zero 
     dtype=int64) 
Смежные вопросы