2014-04-16 21 views
5

Sto usando Python. Come fare una sottoselezione di un vettore, in base ai valori di altri due vettori con la stessa lunghezza?Crea sottoinsieme di array, in base ai valori di altri due array in Python

Per esempio, questo tre vettori

c1 = np.array([1,9,3,5]) 
c2 = np.array([2,2,3,2]) 
c3 = np.array([2,3,2,3]) 

c2==2 
array([ True, True, False, True], dtype=bool) 
c3==3 
array([False, True, False, True], dtype=bool) 

voglio fare qualcosa di simile:

elem = (c2==2 and c3==3) 
c1sel = c1[elem] 

Ma i primi risultati economico in un errore:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
ValueError: The truth value of an array with more than one element is ambiguous. 
Use a.any() or a.all() 

In Matlab, Vorrei usare:

elem = find(c2==2 & c3==3); 
c1sel = c1(elem); 

Come fare questo in Python?

risposta

5

È possibile utilizzare numpy.logical_and:

>>> c1[np.logical_and(c2==2, c3==3)] 
array([9, 5]) 
+0

Grazie, questo funziona bene! – vincentv

+0

Per quanto posso vedere, questo non funziona per più di due condizioni. Per tre o più, uso la soluzione di mskimm. – vincentv

3

In alternativa, provate

>>> c1[(c2==2) & (c3==3)] 
array([9, 5]) 

cf) Per Python Operator Precedence, la priorità di & è superiore rispetto ==. Guarda i risultati seguenti.

>>> 1 == 1 & 2 == 2 
False 

>>> (1 == 1) & (2 == 2) 
True 
+0

Ancora non capisco la differenza tra "e" e "&". Leggerò di più a riguardo. – vincentv

+0

vedere http://stackoverflow.com/questions/3845018/python-boolean-operators-vs-bitwise-operators – emeth

1

devi tenere ciascuna delle vostre condizioni all'interno parentesi:

In []: c1[(c2 == 2) & (c3 == 3)] 
Out[]: array([9, 5]) 
Problemi correlati