是什么解释了列表和NumPy数组上布尔运算和按位运算的行为差异?
我&
对and
在Python中正确使用vs 感到困惑,如以下示例所示。
mylist1 = [True, True, True, False, True]
mylist2 = [False, True, False, True, False]
>>> len(mylist1) == len(mylist2)
True
# ---- Example 1 ----
>>> mylist1 and mylist2
[False, True, False, True, False]
# I would have expected [False, True, False, False, False]
# ---- Example 2 ----
>>> mylist1 & mylist2
TypeError: unsupported operand type(s) for &: 'list' and 'list'
# Why not just like example 1?
>>> import numpy as np
# ---- Example 3 ----
>>> np.array(mylist1) and np.array(mylist2)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
# Why not just like Example 4?
# ---- Example 4 ----
>>> np.array(mylist1) & np.array(mylist2)
array([False, True, False, False, False], dtype=bool)
# This is the output I was expecting!
这个答案和这个答案帮助我理解这and
是一个布尔运算,但是&
是按位运算。
我阅读了有关按位运算的信息,以更好地理解该概念,但是我正在努力使用该信息来理解我上面的四个示例。
示例4使我达到了期望的输出,这很好,但是我仍然对何时/如何/为什么使用and
vs 感到困惑&
。为什么列表和NumPy数组在这些运算符上的行为不同?
谁能帮助我了解布尔运算和按位运算之间的区别,以解释为什么它们对列表和NumPy数组的处理方式不同?
mylist1 and mylist2
不会输出与相同的结果mylist2 and mylist1
,因为返回的是delnan指出的第二个列表。
np.bitwise_and()
和np.logical_and()
和朋友,以避免混淆。