设x为NumPy数组。以下几点:

(x > 1) and (x < 3)

给出错误信息:

ValueError:包含多个元素的数组的真值为 模糊。使用a.any()或a.all()

我怎么解决这个问题?


当前回答

以@ZF007的回答为例,这并不是在整体上回答你的问题,但可以作为同样错误的解决方案。我把它贴在这里,因为我还没有找到一个直接的解决方案来回答这个错误消息在Stack Overflow的其他地方。

当您检查数组是否为空时,会出现此错误。

if np.array([1,2]): print(1) --> ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(). if np.array([1,2])[0]: print(1) --> no ValueError, but: if np.array([])[0]: print(1) --> IndexError: index 0 is out of bounds for axis 0 with size 0. if np.array([1]): print(1) --> no ValueError, but again will not help at an array with many elements. if np.array([]): print(1) --> DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use 'array.size > 0' to check that an array is not empty. if np.array([]).size is not None: print(1): Taking up a comment by this user, this does not work either. This is since no np.array can ever be the same object as None - that object is unique - and thus will always match is not None (i.e. never match is None) whether or not it's empty.

这样做:

如果np.array([])。大小:打印(1)解决了错误。

其他回答

通常,当比较两个单个数字时,Python常规代码可以正常工作,但在数组中,有一些数字(不止一个数字)应该并行处理。

例如,让我们假设如下:

a = np.array([1, 2, 3])
b = np.array([2, 3, 4])

你想检查b >= a: ?

因为,a和b不是个位数,你的意思是,如果b的每个元素都大于a中相似的数字,那么你应该使用以下命令:

if (b >= a).all():
 print("b is greater than a!")

最简单的答案是用“&”而不是“and”。

>>> import numpy as np
>>> arr = np.array([1, 4, 2, 7, 5])
>>> arr[(arr > 3) and (arr < 6)]   # this will fail
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()
>>> arr[(arr > 3) & (arr < 6)]   # this will succeed
array([4, 5])

如果a和b是布尔NumPy数组,&操作返回它们的元素:

a & b

返回一个布尔数组。要将其减少为一个布尔值,可以使用其中任何一个

(a & b).any()

or

(a & b).all()

注意:如果a和b是非布尔数组,请考虑(a - b).any()或(a - b).all()。


基本原理

NumPy开发人员认为,在布尔上下文中没有一种普遍理解的方法来计算数组:如果任何元素为True,它可能意味着True;如果所有元素都为True,它可能意味着True;如果数组长度非零,它可能意味着True,仅举三种可能性。

由于不同的用户可能有不同的需求和不同的假设,因此 NumPy开发人员拒绝猜测,而是决定在任何时候尝试在布尔上下文中计算数组时引发ValueError。对两个numpy数组应用和会导致这两个数组在布尔上下文中求值(通过在Python3中调用__bool__或在Python2中调用__nonzero__)。

以@ZF007的回答为例,这并不是在整体上回答你的问题,但可以作为同样错误的解决方案。我把它贴在这里,因为我还没有找到一个直接的解决方案来回答这个错误消息在Stack Overflow的其他地方。

当您检查数组是否为空时,会出现此错误。

if np.array([1,2]): print(1) --> ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(). if np.array([1,2])[0]: print(1) --> no ValueError, but: if np.array([])[0]: print(1) --> IndexError: index 0 is out of bounds for axis 0 with size 0. if np.array([1]): print(1) --> no ValueError, but again will not help at an array with many elements. if np.array([]): print(1) --> DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use 'array.size > 0' to check that an array is not empty. if np.array([]).size is not None: print(1): Taking up a comment by this user, this does not work either. This is since no np.array can ever be the same object as None - that object is unique - and thus will always match is not None (i.e. never match is None) whether or not it's empty.

这样做:

如果np.array([])。大小:打印(1)解决了错误。

我也遇到了同样的问题(即多条件索引,这里是在某个日期范围内查找数据)。(a-b).any()或(a-b).all()似乎不起作用,至少对我来说是这样。

或者,我找到了另一个解决方案,它完美地满足了我想要的功能(当尝试索引数组时,具有多个元素的数组的真值是不明确的)。

与其使用上面建议的代码,不如使用:

numpy.logical_and(a, b)