20

如果 var(另一个 numpy 数组)中的元素是 >=0 和 <=.1 ,我试图将 rbs 的所有元素放入一个新数组中。但是,当我尝试以下代码时,出现此错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

rbs = [ish[4] for ish in realbooks]
for book in realbooks:
    var -= float(str(book[0]).replace(":", ""))
    bidsred = rbs[(var <= .1) and (var >=0)]

关于我做错了什么的任何想法?

4

3 回答 3

34

正如我在对先前答案的评论中告诉您的那样,您需要使用以下任一方法:

c[a & b]

或者

c[np.logical_and(a, b)] 

原因是andPython 使用关键字在两个布尔值之间进行测试。数组怎么可能是布尔值?如果它的 75% 的项目是True,是吗TrueFalse因此,numpy 拒绝比较两者。

因此,您要么必须使用逻辑函数逐个元素地比较两个布尔数组 ( np.logical_and),要么使用二元运算符&

此外,出于索引目的,您确实需要一个与您要索引的数组大小相同的布尔数组。它必须是一个数组,你不能使用一个列表来True/False代替:原因是使用布尔数组告诉 NumPy 返回哪个元素。如果您使用 的列表True/False,NumPy 会将其解释1/0为整数列表,即索引,这意味着您将获得数组的第二个或第一个元素。不是你想要的。

现在,您可以猜到,如果您想使用两个布尔数组ab用于索引,选择其中一个ab为 True 的项目,您将使用

c[np.logical_or(a,b)]

或者

c[a | b]
于 2012-09-28T21:22:52.380 回答
13

尝试在涉及 Numpy 数组的比较表达式上使用 Python 布尔运算符 ( not, and, ) 时,通常会收到此错误消息,例如or

>>> x = np.arange(-5, 5)
>>> (x > -2) and (x < 2)
Traceback (most recent call last):
  File "<ipython-input-6-475a0a26e11c>", line 1, in <module>
    (x > -2) and (x < 2)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

这是因为这样的比较,与 Python 中的其他比较相反,创建布尔数组而不是单个布尔值(但也许你已经知道了):

>>> x > -2
array([False, False, False, False,  True,  True,  True,  True,  True,  True], dtype=bool)
>>> x < 2
array([ True,  True,  True,  True,  True,  True,  True, False, False, False], dtype=bool)

您的问题的部分解决方案可能替换andnp.logical_and,它在两个数组上广播 AND 操作np.bool

>>> np.logical_and(x > -2, x < 2)
array([False, False, False, False,  True,  True,  True, False, False, False], dtype=bool)
>>> x[np.logical_and(x > -2, x < 2)]
array([-1,  0,  1])

但是,此类布尔数组不能用于索引普通 Python 列表,因此您需要将其转换为数组:

rbs = np.array([ish[4] for ish in realbooks])
于 2012-09-28T21:21:38.340 回答
0
# draw the previous original bounding boxes
if rectsPersist != None:
    for (x, y, w, h) in rectsPersist:
        cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2)

# draw the previous final bounding boxes
if pickPersist != None:
    for (xA, yA, xB, yB) in pickPersist:
        cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2)

if not count % 1:
    count = 0
    image = imutils.resize(image, width=min(700, image.shape[1]))

如果 rectsPersist != None: ValueError: 具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all()

于 2019-01-17T19:57:08.047 回答