ValueError: 数组有多个元素的真值不明确。使用a.any()或a.all()
ValueError: 数组有多个元素的真值不明确。使用a.any()或a.all()
假设 x
是一个NumPy数组。以下代码:
(x > 1) and (x < 3)
会出现以下错误信息:
ValueError: The truth value of an array with more than one element is
ambiguous. Use a.any() or a.all()
如何解决这个问题?
admin 更改状态以发布 2023年5月21日
我也遇到了同样的问题(即使用多条件进行索引,这里是在特定日期范围内查找数据)。(a-b).any()
或 (a-b).all()
似乎不能工作,至少对我来说是这样。
作为替代方法,我找到了另一个完美解决我所需功能的解决方案(当尝试索引数组时,数组的多个元素的真值是含糊不清的)。
与上述建议代码不同,使用以下代码:
numpy.logical_and(a, b)
如果a
和b
是布尔型的NumPy数组,&
操作会返回它们的逐元素与运算结果:
a & b
这将返回一个布尔型数组。如果要将其简化为一个布尔值,可以使用以下两种方式之一:
(a & b).any()
(a & b).all()
注意:如果a
和b
是非布尔型数组,请考虑使用(a - b).any()
或者(a - b).all()
。
原理
NumPy开发者认为,对于数组进行布尔型操作没有一个通用的理解方式:它可能是表示只要有任意一个元素为True
,就返回True
,也可能是表示只有所有元素都为True
时才返回True
,还可能是表示只要数组的长度不为零,就返回True
,仅仅是举例而已,还有其他可能性。
由于不同的用户需要和假设不同,NumPy开发者不愿猜测,而是决定在尝试对数组进行布尔操作时引发一个ValueError
异常。对两个numpy数组应用and
操作会使这两个数组在布尔上下文中被评估(通过在Python3中调用__bool__
或在Python2中调用__nonzero__
)。