为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

撒科打诨 2019-06-17 16:02:59
ValueError:包含多个元素的数组的真值是不明确的。使用.any()或a.all()我刚刚在我的代码中发现了一个逻辑错误,它导致了各种各样的问题。我无意中做了一个按位和而不是逻辑与.我将代码更改为: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:包含多个元素的数组的真值是不明确的。使用.any()或a.all()为什么在使用按位操作时没有发出类似的错误-以及如何修复这个错误?
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

例外的原因是and隐式调用bool..首先在左操作数和(如果左操作数是True)然后在右边操作数上。所以x and y等于bool(x) and bool(y).

但是bool在.上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,但也在ifwhileor因此,以下任何一个示例都将失败:

>>> arr and arrValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()>>> if arr: passValueError:
 The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()>>> while arr: passValueError: The truth value of
  an array with more than one element is ambiguous. Use a.any() or a.all()>>> arr or arrValueError: 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会打电话boolbool(2 < x) and bool(x < 10).

这个元素级等价物and会是np.logical_and函数,类似地,您可以使用np.logical_or相当于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文档中可以找到逻辑和二进制函数的完整列表:


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 0 关注
  • 7080 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信