2014-04-16 60 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]) 
相关问题