在将按位运算符和比较运算符与numpy数组一起使用时,内部会发生什么并引发ValueError?

问题描述

import numpy as np

arr = np.array([3,4,6,15,25,38])


print(arr > 5 & arr <= 20)

"""Output
Traceback (most recent call last):
  File "main.py",line 11,in <module>
    print(arr > 5 & arr <= 20)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
"""

我知道会发生此错误,因为我错过了条件周围的括号。但是我想知道表达式的计算顺序以及导致此错误的原因。

解决方法

&<=higher precedence,因此它以arr > (5 & arr) <= 20 and since comparison operators are chained的身份运行,等效于:

(arr > (5 & arr)) and (arr <= (5 & arr))

这会导致众所周知的错误,因为您不能在布尔上下文中使用数组,如错误消息所解释的...(注意,5 & arr仅被评估一次...)

所以请考虑,即使这样也会失败:

>>> arr = np.array([1,2,3,4,5])
>>> 0 < arr < 4
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()