猿问

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

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

为什么在使用按位操作时没有发出类似的错误-以及如何修复这个错误?


撒科打诨
浏览 7081回答 3
3回答

DIEA

例外的原因是and隐式调用bool..首先在左操作数和(如果左操作数是True)然后在右边操作数上。所以x and y等于bool(x) and bool(y).但是bool在.上numpy.ndarray(如果它包含多个元素)将引发您已经看到的异常:>>>&nbsp;import&nbsp;numpy&nbsp;as&nbsp;np>>>&nbsp;arr&nbsp;=&nbsp;np.array([1,&nbsp;2,&nbsp;3])>>>&nbsp;bool(arr)ValueError:&nbsp;The&nbsp;truth&nbsp;value&nbsp;of&nbsp;an&nbsp;array&nbsp;with&nbsp;more&nbsp;than&nbsp;one&nbsp;element&nbsp;is&nbsp;ambiguous. &nbsp;Use&nbsp;a.any()&nbsp;or&nbsp;a.all()这个bool()调用隐含在and,但也在if,&nbsp;while,&nbsp;or因此,以下任何一个示例都将失败:>>>&nbsp;arr&nbsp;and&nbsp;arrValueError:&nbsp;The&nbsp;truth&nbsp;value&nbsp;of&nbsp;an&nbsp;array&nbsp;with&nbsp;more&nbsp;than&nbsp;one&nbsp;element&nbsp;is&nbsp;ambiguous.&nbsp;Use&nbsp;a.any()&nbsp;or&nbsp;a.all()>>>&nbsp;if&nbsp;arr:&nbsp;passValueError: &nbsp;The&nbsp;truth&nbsp;value&nbsp;of&nbsp;an&nbsp;array&nbsp;with&nbsp;more&nbsp;than&nbsp;one&nbsp;element&nbsp;is&nbsp;ambiguous.&nbsp;Use&nbsp;a.any()&nbsp;or&nbsp;a.all()>>>&nbsp;while&nbsp;arr:&nbsp;passValueError:&nbsp;The&nbsp;truth&nbsp;value&nbsp;of &nbsp;&nbsp;an&nbsp;array&nbsp;with&nbsp;more&nbsp;than&nbsp;one&nbsp;element&nbsp;is&nbsp;ambiguous.&nbsp;Use&nbsp;a.any()&nbsp;or&nbsp;a.all()>>>&nbsp;arr&nbsp;or&nbsp;arrValueError:&nbsp;The&nbsp;truth&nbsp;value&nbsp;of&nbsp;an&nbsp;array&nbsp;with&nbsp;more&nbsp;than &nbsp;&nbsp;&nbsp;one&nbsp;element&nbsp;is&nbsp;ambiguous.&nbsp;Use&nbsp;a.any()&nbsp;or&nbsp;a.all()Python中有更多的函数和语句隐藏bool例如,调用2 < x < 10只是另一种写作方式2 < x and x < 10..而and会打电话bool:&nbsp;bool(2 < x) and bool(x < 10).这个元素级等价物and会是np.logical_and函数,类似地,您可以使用np.logical_or相当于or.用于布尔数组-以及如下所示的比较<,&nbsp;<=,&nbsp;==,&nbsp;!=,&nbsp;>=和>在NumPy数组上返回布尔NumPy数组-您也可以使用元素按位职能(和操作员):np.bitwise_and&nbsp;(&操作员)>>>&nbsp;np.logical_and(arr&nbsp;>&nbsp;1,&nbsp;arr&nbsp;<&nbsp;3)array([False,&nbsp;&nbsp;True,&nbsp;False],&nbsp;dtype=bool)>>>&nbsp;np.bitwise_and(arr&nbsp;>&nbsp;1,&nbsp;arr&nbsp;<&nbsp;3)array([False,&nbsp;&nbsp;True,&nbsp;False], &nbsp;dtype=bool)>>>&nbsp;(arr&nbsp;>&nbsp;1)&nbsp;&&nbsp;(arr&nbsp;<&nbsp;3)array([False,&nbsp;&nbsp;True,&nbsp;False],&nbsp;dtype=bool)和bitwise_or&nbsp;(|(操作员):>>>&nbsp;np.logical_or(arr&nbsp;<=&nbsp;1,&nbsp;arr&nbsp;>=&nbsp;3)array([&nbsp;True,&nbsp;False,&nbsp;&nbsp;True],&nbsp;dtype=bool)>>>&nbsp;np.bitwise_or(arr&nbsp;<=&nbsp;1,&nbsp;arr&nbsp;>=&nbsp;3)array([&nbsp;True,&nbsp;False,&nbsp;&nbsp;True], &nbsp;dtype=bool)>>>&nbsp;(arr&nbsp;<=&nbsp;1)&nbsp;|&nbsp;(arr&nbsp;>=&nbsp;3)array([&nbsp;True,&nbsp;False,&nbsp;&nbsp;True],&nbsp;dtype=bool)在NumPy文档中可以找到逻辑和二进制函数的完整列表:“逻辑功能”“二进制操作”
随时随地看视频慕课网APP

相关分类

Python
我要回答