La raison de l'exception est que les andappels implicitement bool. D'abord sur l'opérande de gauche et (si l'opérande de gauche l'est True) puis sur l'opérande de droite. x and yEst donc équivalent à bool(x) and bool(y).
Cependant le boolsur un numpy.ndarray(s'il contient plus d'un élément) lèvera l'exception que vous avez vue:
>>> 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()
L' bool()appel est en implicite and, mais aussi if, while, or, donc l' un des exemples suivants également échouer:
>>> 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()
Il y a plus de fonctions et d'instructions en Python qui cachent les boolappels, par exemple, 2 < x < 10c'est juste une autre façon d'écrire 2 < x and x < 10. Et l' andappellera bool: bool(2 < x) and bool(x < 10).
L' équivalent élément par élément pour andserait la np.logical_andfonction, de la même manière que vous pourriez utiliser np.logical_orcomme équivalent pouror .
Pour les tableaux booléennes - et les comparaisons aiment <, <=, ==, !=, >=et >sur les tableaux NumPy renvoient des tableaux numpy booléennes - vous pouvez également utiliser les bitwise-sage élément fonctions (et opérateurs): np.bitwise_and( &opérateur)
>>> 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)
et bitwise_or( |opérateur):
>>> 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)
Une liste complète des fonctions logiques et binaires se trouve dans la documentation NumPy: