异常的原因是and
隐式调用bool
. 首先在左操作数和(如果左操作数是True
)然后在右操作数上。所以x and y
等价于bool(x) and bool(y)
。
但是bool
on a numpy.ndarray
(如果它包含多个元素)将抛出您看到的异常:
>>> import numpy as np
>>> arr = np.array([1, 2, 3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
该bool()
调用隐含在and
, if
,中while
,or
因此以下任何示例也将失败:
>>> arr and arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> if arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> while arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> arr or arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Python中有更多隐藏bool
调用的函数和语句,例如2 < x < 10
只是另一种编写方式2 < x and x < 10
。并且and
将调用bool
:bool(2 < x) and bool(x < 10)
。
元素等效的 for将and
是np.logical_and
函数,类似地,您可以将np.logical_or
其用作等效的 for or
。
对于布尔数组 - 以及类似, , , 和<
NumPy<=
数组==
上!=
的比较返回布尔 NumPy 数组 - 您还可以使用逐元素位函数(和运算符):(运算符)>=
>
np.bitwise_and
&
>>> np.logical_and(arr > 1, arr < 3)
array([False, True, False], dtype=bool)
>>> np.bitwise_and(arr > 1, arr < 3)
array([False, True, False], dtype=bool)
>>> (arr > 1) & (arr < 3)
array([False, True, False], dtype=bool)
和bitwise_or
(|
运算符):
>>> np.logical_or(arr <= 1, arr >= 3)
array([ True, False, True], dtype=bool)
>>> np.bitwise_or(arr <= 1, arr >= 3)
array([ True, False, True], dtype=bool)
>>> (arr <= 1) | (arr >= 3)
array([ True, False, True], dtype=bool)
完整的逻辑和二进制函数列表可以在 NumPy 文档中找到: