当尝试索引一个具有多个元素的数组时,该数组的真值是不明确的。
当尝试对一个数组进行索引时,如果数组中含有多个元素,其真值是不明确的,就会出现该错误信息。这个问题通常发生在尝试使用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])
在Python中,关键字and
用于测试两个布尔值之间的关系。但是,如何将一个数组视为布尔值呢?如果数组中有75%的元素为True
,那么它是True
还是False
?因此,NumPy拒绝对这两个进行比较。
因此,可以使用c[a & b]
或c[np.logical_and(a, b)]
来解决该问题。无论是使用a & b
还是np.logical_and(a, b)
来组合a
和b
数组,都会产生一个与输入数组a
和b
大小相同的布尔数组,这在下一步对同样大小的数组c
进行索引时是必要的。
不能使用一个布尔值列表进行索引。NumPy将其解释为索引值的列表(将True
视为1
,将False
视为0
),因此输出将包含数组的前两个元素的多个副本,而不是一个掩码版本。
类似地,如果要选择c
中要么a
或b
对应元素为真的元素,则可以使用c[a | b]
或c[np.logical_or(a, b)]
。