2016-06-10 52 views
0

我到处搜索了一个答案,对不起,如果这是一个非常基本的问题。我使用布尔Numpy数组过滤Numpy数组,这是通过比较3个不同数组中相同索引的值创建的。对于所有指数i,我的比较都由2个独立的布尔语句组成,例如x [i] == y [i] & x [i]!= z [i]。下面是令人不安的结果:Python 2.x在非常特殊的情况下,True和False返回True

x[8]=25 

y[8]=27 

z[8]=13 

x[8]==y[8] 

False 

x[8]!=z[8] 

True 

x[8]==y[8] & x[8]!=z[8] 

True 

正如你所看到的,上面假&真,则返回真。我错过了什么?正如我无奈的另一个例子,这里是从正在返回正确的结果相同的阵列另一个例子:

x[3]=24 

y[3]=18 

z[3]=27 

x[3]==y[3] 

False 

x[3]!=z[3] 

True 

x[3]==y[3] & x[3]!=z[3] 

False 

正如你所看到的,这个例子能正常工作。任何帮助,将不胜感激。

谢谢!

回答

2

我错过了什么?

你缺少括号:

(x[8]==y[8]) & (x[8]!=z[8]) 

此外,你应该做这为在整个阵列的矢量操作,而不是通过遍历指数。希望你这样做你真正的代码,而你只是使用的特定指数在这里让这个例子更简单:

(x == y) & (x != z) # Evaluates to an array of booleans. 

&是按位与运算,而不是逻辑与,但由于逻辑and可以”为了广播而重载(有充分的理由),NumPy使用&作为布尔数组上的逻辑AND。 &and的优先级不同,因此您需要将一些操作用括号括起来,这些操作不需要用and加括号。

+0

“NumPy使用'&'在布尔数组上进行逻辑与操作”实际上是有意义的,因为布尔逻辑和按位操作本质上是相同的(特别是如果将True视为1并将False视为0 ) – DeepSpace

+0

谢谢!这是一个很好的答案,并立即修复了一切。是的,我只是使用特定的索引作为例子。再次感谢! – golfrguy04

-1

做(X [8] == Y [8])&(X [8]!= Z [8]) 或甚至更好 X [8] == Y [8]和X [8] !'= z [8]