Przyczyną wyjątku jest to, że and
niejawnie wywołuje bool
. Najpierw na lewym operandzie i (jeśli lewy jest True
), a następnie na prawym. Więc x and y
jest równoważna bool(x) and bool(y)
.
Jednak bool
na a numpy.ndarray
(jeśli zawiera więcej niż jeden element) zgłosi wyjątek, który widziałeś:
>>> 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()
Połączenie jest ukryte w and
, ale również w if
, while
, or
, więc każdy z poniższych przykładów nie powiedzie się także:
>>> 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()
W Pythonie jest więcej funkcji i instrukcji, które ukrywają bool
wywołania, na przykład 2 < x < 10
to po prostu inny sposób pisania 2 < x and x < 10
. I and
wezwie bool
: bool(2 < x) and bool(x < 10)
.
Elementem mądry odpowiednikiem and
byłby np.logical_and
funkcja, podobnie można użyć np.logical_or
jako ekwiwalent za or
.
Dla tablic logicznych - i porównania podoba <
, <=
, ==
, !=
, >=
i >
na powrót logicznych NumPy tablice tablice numpy - można również użyć elementu mądry bitowe funkcje (i operatorów): np.bitwise_and
( &
Operator)
>>> 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)
oraz bitwise_or
( |
operator):
>>> 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)
Pełna lista funkcji logicznych i binarnych znajduje się w dokumentacji NumPy: