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

12 浏览
0 Comments

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

我试图将rbs的所有元素放入一个新数组中,条件是var(另一个numpy数组)中的元素大于等于0且小于等于0.1。然而,当我尝试以下代码时,出现以下错误:

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

有没有关于我做错了什么的想法?

0
0 Comments

当尝试对一个数组进行索引时,如果数组中含有多个元素,其真值是不明确的,就会出现该错误信息。这个问题通常发生在尝试使用Python布尔运算符(not, and, or)或涉及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)

要解决这个问题,可以用np.logical_and替换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])

0
0 Comments

在Python中,关键字and用于测试两个布尔值之间的关系。但是,如何将一个数组视为布尔值呢?如果数组中有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对应元素为真的元素,则可以使用c[a | b]c[np.logical_or(a, b)]

0