You usually get this error message when trying to use Python boolean operators (not
, and
, or
) on comparison expressions involving Numpy arrays, e.g.
>>> 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()
That's because such comparisons, as opposed to other comparisons in Python, create arrays of booleans rather than single booleans (but maybe you already knew that):
>>> 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)
Part of the solution to your problem probably to replace and
by np.logical_and
, which broadcasts the AND operation over two arrays of 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])
However, such arrays of booleans cannot be used to index into ordinary Python lists, so you need to convert that to an array:
rbs = np.array([ish[4] for ish in realbooks])