Przyczyną wyjątku jest to, że andniejawnie wywołuje bool. Najpierw na lewym operandzie i (jeśli lewy jest True), a następnie na prawym. Więc x and yjest równoważna bool(x) and bool(y).
Jednak boolna 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ą boolwywołania, na przykład 2 < x < 10to po prostu inny sposób pisania 2 < x and x < 10. I andwezwie bool: bool(2 < x) and bool(x < 10).
Elementem mądry odpowiednikiem andbyłby np.logical_andfunkcja, podobnie można użyć np.logical_orjako 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: