是什么解释了列表和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使我达到了期望的输出,这很好,但是对于何时/如何/为什么应该使用andvs 仍然感到困惑&。为什么列表和NumPy数组在这些运算符上的行为不同?
谁能帮助我理解布尔运算和按位运算之间的区别,以解释为什么它们对列表和NumPy数组的处理方式不同?
and测试两个表达式在逻辑上是否相符,True而&(当与True/ False值一起使用时)测试两个表达式是否均在逻辑上True。
and
True
&
True/ False
在Python中,通常将空的内置对象在逻辑上视为,False而将非空的内置对象在逻辑上视为True。这可以简化常见的用例,在这种情况下,如果列表为空,则要执行某项操作;如果列表不为空,则要执行其他操作。请注意,这意味着列表[False]在逻辑上是True:
[False]
>>> if [False]: ... print 'True' ... True
因此,在示例1中,第一个列表是非空的,因此在逻辑上是True,因此的真值and与第二个列表的真值相同。(在我们的例子中,第二个列表是非空的,因此从逻辑上讲是True,但要识别出该列表将需要不必要的计算步骤。)
例如,列表2不能以位方式有意义地组合,因为它们可以包含任意不同的元素。可以按位组合的事物包括:对和错,整数。
相反,NumPy对象支持矢量化计算。也就是说,它们使你可以对多个数据执行相同的操作。
NumPy
示例3失败,因为NumPy数组(长度> 1)没有真值,因为这可以防止基于矢量的逻辑混淆。
示例4只是一个向量化位and操作。
底线
如果你不处理数组并且不执行整数的数学运算,则可能需要and。
如果你有真值的载体,你想结合,使用numpy与&。
numpy