2014-04-16 64 views
5

我正在使用Python。如何根據另外兩個具有相同長度的向量的值來創建向量的子選擇?基於Python中兩個其他數組的值創建數組的子集

例如,這三個矢量

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) 

我想要做這樣的事情:

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

但第一條語句導致一個錯誤:

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

在Matlab中,我會用:

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

如何在Python中做到這一點?

回答

5

您可以使用numpy.logical_and

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

謝謝,這工作得很好! – vincentv

+0

據我所見,這不適用於兩個以上的條件。對於三個或更多,我使用mskimm的解決方案。 – vincentv

3

或者,嘗試

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

CF)通過Python Operator Precedence&的優先級高於==上。看下面的結果。

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

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

我仍然不明白'和'與'&'之間的區別。我會讀更多關於它。 – vincentv

+0

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

1

你必須保持你的每一個條件在括號內:

In []: c1[(c2 == 2) & (c3 == 3)] 
Out[]: array([9, 5]) 
相關問題