O motivo da exceção é que and
chama implicitamente bool
. Primeiro no operando esquerdo e (se o operando esquerdo estiver True
), depois no operando direito. Então x and y
é equivalente a bool(x) and bool(y)
.
No entanto, o bool
on a numpy.ndarray
(se contiver mais de um elemento) lançará a exceção que você viu:
>>> 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()
A bool()
chamada está em implícito and
, mas também em if
, while
, or
, então qualquer um dos exemplos a seguir também falhará:
>>> 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()
Existem mais funções e instruções no Python que ocultam bool
chamadas, por exemplo, 2 < x < 10
é apenas outra maneira de escrever 2 < x and x < 10
. E o and
chamará bool
: bool(2 < x) and bool(x < 10)
.
O equivalente a elementosand
seria para a np.logical_and
função, da mesma forma que você poderia usar np.logical_or
como equivalente para or
.
Para matrizes booleanas - e comparações como <
, <=
, ==
, !=
, >=
e >
no NumPy matrizes retornam matrizes Numpy boolean - você também pode usar os elementos-wise bit a bit funções (e operadores): np.bitwise_and
( &
operador)
>>> 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)
e bitwise_or
( |
operador):
>>> 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)
Uma lista completa de funções lógicas e binárias pode ser encontrada na documentação do NumPy: