Причиной исключения является то, что and
неявно вызывает bool
. Сначала в левом операнде и (если левый операнд True
), то в правом операнде. Таким образом, x and y
эквивалентен bool(x) and bool(y)
.
Однако bool
в numpy.ndarray
(если он содержит более одного элемента) выдаст исключение, которое вы видели:
>>> import numpy as np
>>> arr = np.array([1, 2, 3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Вызов bool()
неявные в and
, но также в if
, while
, or
, поэтому любой из следующих примеров также потерпит неудачу:
>>> arr and arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> if arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> while arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> arr or arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
В Python есть больше функций и операторов, hide bool
, например 2 < x < 10
- это еще один способ записи 2 < x and x < 10
. И and
назовет bool
: bool(2 < x) and bool(x < 10)
.
Элементарным эквивалентом для and
будет функция np.logical_and
, аналогично вы можете использовать np.logical_or
как эквивалент для or
.
Для булевых массивов - и сравнения, такие как <
, <=
, ==
, !=
, >=
и >
на массивах NumPy возвращают логические массивы NumPy - вы также можете использовать побитовые функции по элементам (и операторы): np.bitwise_and
(&
оператор)
>>> np.logical_and(arr > 1, arr < 3)
array([False, True, False], dtype=bool)
>>> np.bitwise_and(arr > 1, arr < 3)
array([False, True, False], dtype=bool)
>>> (arr > 1) & (arr < 3)
array([False, True, False], dtype=bool)
и bitwise_or
(|
]:
>>> np.logical_or(arr <= 1, arr >= 3)
array([ True, False, True], dtype=bool)
>>> np.bitwise_or(arr <= 1, arr >= 3)
array([ True, False, True], dtype=bool)
>>> (arr <= 1) | (arr >= 3)
array([ True, False, True], dtype=bool)
Полный список логических и двоичных функций можно найти в документации NumPy: