尝试索引数组时,具有多个元素的数组的真值是不明确的

时间:2012-09-28 21:14:51

标签: python numpy list-comprehension

如果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)]

关于我做错的任何想法?

3 个答案:

答案 0 :(得分:30)

正如我在对先前回答的评论中告诉你的那样,你需要使用:

c[a & b]

c[np.logical_and(a, b)] 

原因是Python使用and关键字来测试两个布尔值。数组如何成为布尔值?如果其中75%的项目为True,那么它是True还是False?因此,numpy拒绝比较两者。

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

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

现在,您可以猜测,如果您想使用两个布尔数组ab进行索引,请选择ab为的项目没错,你要用

c[np.logical_or(a,b)]

c[a | b]

答案 1 :(得分:8)

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

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

您的问题的部分解决方案可能是and取代np.logical_andnp.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]) 数组广播AND操作。

rbs = np.array([ish[4] for ish in realbooks])

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

{{1}}

答案 2 :(得分: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!=无: ValueError:具有多个元素的数组的真值不明确。使用a.any()或a.all()