2014-04-16 5 views
5

ich Python verwende. Wie man eine Unterauswahl eines Vektors macht, basierend auf den Werten von zwei anderen Vektoren mit der gleichen Länge?Stellen Teilmenge von Array, basierend auf den Werten von zwei anderen Arrays in Python

Zum Beispiel dieser drei Vektoren

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) 

ich so etwas wie dies tun will:

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

Aber die erste Anweisung führt zu einem Fehler:

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, Ich würde verwenden:

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

Wie dies in Python zu tun?

Antwort

5

Sie numpy.logical_and verwenden können:

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

Danke, das funktioniert gut! – vincentv

+0

Soweit ich sehen kann, funktioniert dies nicht für mehr als zwei Bedingungen. Für drei oder mehr benutze ich die Lösung von mskimm. – vincentv

3

Alternativ versuchen

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

cf) Mit Python Operator Precedence ist die Priorität von & oberen als ==. Siehe die folgenden Ergebnisse.

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

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

Ich verstehe immer noch nicht den Unterschied zwischen 'und' und '&'. Ich werde mehr darüber lesen. – vincentv

+0

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

1

Sie haben alle Ihre Bedingungen in Klammern zu halten:

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