numpy.logical_and和&之间的区别

30

我正在尝试使用两个或多个numpy数组的logical_and。我知道numpy有函数logical_and(),但我发现简单的运算符&返回相同的结果,并且更容易使用。

例如,考虑三个numpy数组a、b和c。是否 np.logical_and(a, np.logical_and(b,c)) 等同于 a & b & c

如果它们(或多或少)相等,那么使用logical_and()的优点是什么?


9
从http://docs.scipy.org/doc/numpy/reference/generated/numpy.bitwise_and.html得知,“计算输入数组中整数的基础二进制表示的按位与(bit-wise AND)”,仅适用于整数和布尔值。 它与np.logical_and不完全相同,除了处理布尔值时。 - user1121588
2个回答

29

@user1121588在评论中已经回答了大部分问题,但为了全面回答...

"位与"运算符(&)在布尔数组上的行为与logical_and类似,但它不像使用logical_and那样清晰表达意图,并且在处理非平凡情况(可能是紧缩或稀疏数组)时会导致得到错误答案的可能性。

要在多个数组上使用logical_and,请执行以下操作:

np.logical_and.reduce([a, b, c])

其中的参数是一个数组列表,您可以将其中尽可能多的数组一起使用 logical_and 函数。这些数组应该具有相同的形状。


8
值得一提的是,如果速度是一个关键因素,那么位运算(例如 等)比相应的函数(例如 logical_and)要快得多。对我来说,它们的差异大约是4倍。 - Torben545

24
我一直在谷歌上搜索官方确认,我可以在NumPy bool数组中使用&代替logical_and,并找到了一个NumPy v1.15手册中的记录

如果您知道您有布尔参数,您可以使用NumPy的位运算符,但是要小心括号,像这样:z = (x > 1) & (x < 2)。缺少NumPy运算符形式的logical_andlogical_or是Python设计不幸的后果。

因此,人们也可以使用~来表示logical_not|用于logical_or


7
优先级:NumPy的“&”运算符优先级高于诸如“<”和“>”之类的逻辑运算符;而Matlab的则相反。 这正是我正在寻找的参考资料。谢谢。 - Ombrophile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接