Question
Let x
be a NumPy array. The following:
(x > 1) and (x < 3)
Gives the error message:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
How do I fix this?
Answer
If a
and b
are Boolean NumPy arrays, the &
operation returns the
elementwise-and of them:
a & b
That returns a Boolean array. To reduce this to a single Boolean value , use either
(a & b).any()
or
(a & b).all()
Note: if a
and b
are non-Boolean arrays, consider (a - b).any()
or `(a
- b).all()` instead.
Rationale
The NumPy developers felt there was no one commonly understood way to evaluate
an array in Boolean context: it could mean True
if any element is True
,
or it could mean True
if all elements are True
, or True
if the array
has non-zero length, just to name three possibilities.
Since different users might have different needs and different assumptions,
the NumPy developers refused to guess and instead decided to raise a
ValueError
whenever one tries to evaluate an array in Boolean context.
Applying and
to two numpy arrays causes the two arrays to be evaluated in
Boolean context (by calling __bool__
in Python3 or __nonzero__
in
Python2).