Причиной исключения является то, что andнеявные вызовы bool. Сначала в левом операнде и (если левый операнд True), затем в правом операнде. Так x and yэквивалентно bool(x) and bool(y).
Однако boolon on 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 есть больше функций и операторов, которые скрывают 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: