尝试在涉及 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)
您的问题的部分解决方案可能替换and
为np.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])