当前位置: 首页 > 知识库问答 >
问题:

ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

尉迟景福
2023-03-14

我刚刚在我的代码中发现了一个逻辑错误,它导致了各种各样的问题。我无意中做了位AND而不是逻辑AND。

我把代码从:

r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]

到:

r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) and (r["dt"] <= enddate))
selected = r[mask]

令我惊讶的是,我得到了一个相当神秘的错误消息

ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

为什么在使用逐位操作时没有发出类似的错误?如何修复?

共有3个答案

费学
2023-03-14

出现异常的原因是隐式调用bool。首先在左操作数上,然后在右操作数上(如果左操作数为True)。所以x和y相当于bool(x)和bool(y)

但是numpy.ndarray上的bool(如果它包含多个元素)将抛出您看到的异常:

>>> 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()调用在中是隐式的,但在ifwhile中也是隐式的,因此以下任何示例也将失败:

>>> 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

在元素方面的等价物是np.logical\u和函数,类似地,您可以使用np.logical\u或作为的等价物。

对于布尔数组和比较,如

>>> 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留档中找到:

  • 逻辑函数
  • 二元运算

上官淮晨
2023-03-14

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

或者,我找到了另一种解决方案,该解决方案非常适合我所需的功能(当尝试索引数组时,具有多个元素的数组的真值是模糊的)。

不要使用上面建议的代码,简单地使用numpy.logical_and(a, b)就可以了。在这里,您可能想要重写代码

selected  = r[numpy.logical_and(r["dt"] >= startdate, r["dt"] <= enddate)]
葛奇
2023-03-14

r是一个numpy(rec)数组。所以r[“dt”]

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

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

你的原始代码

mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]

看起来不错。但是,如果您确实想要,则使用(a-b).any()(a-b).all()代替a和b

 类似资料: