2014-11-06 16 views
6

Vorrei restituire gli indici di tutti i valori in una matrice numpy python compresa tra due valori. Ecco il mio codice:Come restituire indici di valori tra due numeri nell'array numpy

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

Ma restituisce un errore:

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

Mi piacerebbe sapere se c'è un modo di fare questo senza l'iterazione attraverso l'array. Grazie!

risposta

11

Dal array mascherati > < = di ritorno, è possibile moltiplicare insieme per ottenere l'effetto che state cercando (essenzialmente la logica AND):

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

È possibile combinare più espressioni booleane utilizzando le parentesi e il corretto funzionamento :

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

È possibile anche impostare il risultato di np.where ad una variabile per estrarre i valori:

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

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

Per curiosità, c'è qualche differenza tra la moltiplicazione e la congiunzione logica per gli array 'True/False'? – Hooked

+1

@Hooked - Non proprio, ma trovo che le istruzioni logiche composte siano più leggibili – JoshAdel

Problemi correlati