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

20

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

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

有什么想法,我做错了什么吗?


哪一行导致了错误?另外,请格式化您的代码,以便它可以正常运行。 - Brendan Long
如果您打印出变量var的值,会有所帮助。猜测问题可能在于您正在递减的字符串/浮点数/文本替换变量...原始数据看起来是什么样子,需要进行这一系列操作? - abought
除了是一个明显的重复(问题是由示例中最后一行的 and 导致的,这恰好是标准设置),这里给出的标题有误导性 - 问题并没有发生在“尝试索引数组”时,而是在试图使用 and 结合两个掩码时发生。 - Karl Knechtel
2个回答

35
and关键字用于Python测试两个布尔值。一个数组如何成为布尔值?若其75%的元素为True,它是True还是False呢?因此,NumPy拒绝比较这两者。因此,请使用c[a&b]c[np.logical_and(a, b)]。无论是用a & b还是np.logical_and(a, b)来合并ab数组,都将生成与输入数组ab大小相同的布尔数组,这是必要的,如果下一步是对同样大小的数组c进行索引。不能用一个布尔值列表来代替索引。NumPy会将其解释为一组索引值(将True视为1,将False视为0),因此输出将包含该数组的前两个元素的多个副本,而不是掩码版本。同样,要选择来自c的元素,其中ab中的相应元素之一为true,请使用c[a | b]c[np.logical_or(a,b)]

13

通常情况下,这个错误信息是由于试图使用Python布尔运算符(notandor)或涉及NumPy数组的比较表达式而导致的,例如:

>>> 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_and,它会在两个 np.bool 数组之间广播 AND 运算。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接