2014-11-06 1 views
6

Я хотел бы вернуть индексы всех значений в массиве numpy python, которые находятся между двумя значениями. Вот мой код:Как вернуть индексы значений между двумя числами в массиве numpy

inEllipseIndFar = np.argwhere(excessPathLen * 2 < ePL < excessPathLen * 3)

Но она возвращает ошибку:

inEllipseIndFar = np.argwhere((excessPathLen * 2 < ePL < excessPathLen * 3).all()) 
ValueError: The truth value of an array with more than one element is ambiguous. Use 
a.any() or a.all() 

Я хотел бы знать, если есть способ сделать это без перебора массива. Благодаря!

ответ

11

С > < = возврата замаскированных массивов, вы можете умножить их вместе, чтобы получить эффект, который вы ищете (по сути, логическое И):

>>> import numpy as np 
>>> A = 2*np.arange(10) 
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]) 

>>> idx = (A>2)*(A<8) 
>>> np.where(idx) 
array([2, 3]) 
4

Вы можете объединить несколько логических выражений с помощью скобок и исправность работы :

In [1]: import numpy as np 

In [2]: A = 2*np.arange(10) 

In [3]: np.where((A > 2) & (A < 8)) 
Out[3]: (array([2, 3]),) 

Вы также можете установить результат np.where переменной для извлечения значения:

In [4]: idx = np.where((A > 2) & (A < 8)) 

In [5]: A[idx] 
Out[5]: array([4, 6]) 
+2

Из любопытства, есть ли разница между умножением и логической связью для массивов True/False? – Hooked

+1

@Hooked - Не совсем, но я считаю составные логические заявления более читабельными – JoshAdel

Смежные вопросы