Gostaria de verificar se a variável é None ou numpy.array. Eu implementei uma check_a
função para fazer isso.
def check_a(a):
if not a:
print "please initialize a"
a = None
check_a(a)
a = np.array([1,2])
check_a(a)
Mas, esse código gera ValueError. Qual é o caminho direto?
ValueError Traceback (most recent call last)
<ipython-input-41-0201c81c185e> in <module>()
6 check_a(a)
7 a = np.array([1,2])
----> 8 check_a(a)
<ipython-input-41-0201c81c185e> in check_a(a)
1 def check_a(a):
----> 2 if not a:
3 print "please initialize a"
4
5 a = None
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
ValueError
é uma dasnumpy
perguntas mais comuns . Isso significa quenot a
produz um array booleano, com (neste caso) 2 valores. Este array booleano não pode ser usado comoif
condição! Ais None
alternativa é bom saber, mas você também deve compreender este erro.not
, então o erro realmente ocorre quandonot
tenta tratar o array como um único booleano e descobre que não pode. Se tivesse sido~a
, isso teria usado a sobrecarga do NumPy e falhado aoif
tentar usar o array negado como um único booleano.Respostas:
Usar
not a
para testar sea
éNone
pressupõe que os outros valores possíveis dea
têm um valor verdade deTrue
. No entanto, a maioria dos arrays NumPy não tem um valor verdadeiro enot
não pode ser aplicada a eles.Se você quiser testar se um objeto o é
None
, a maneira mais geral e confiável é usar literalmente umais
verificação contraNone
:Isso não depende de objetos possuírem um valor verdadeiro, então funciona com matrizes NumPy.
Observe que o teste tem que ser
is
, não==
.is
é um teste de identidade de objeto.==
é o que quer que os argumentos digam, e os arrays NumPy dizem que é uma comparação de igualdade de elemento a elemento transmitida, produzindo um array booleano:Por outro lado, se você quiser testar se um objeto é uma matriz NumPy, você pode testar seu tipo:
Você também pode usar
isinstance
, que também retornaráTrue
para subclasses desse tipo (se for o que você deseja). Considerando o quão terrível e incompatívelnp.matrix
é, você pode não querer isso:fonte
Se você está tentando fazer algo muito semelhante
a is not None
:, surge o mesmo problema. Ou seja, Numpy reclama que deve-se usara.any
oua.all
.Uma solução alternativa é fazer:
Não é muito bonito, mas faz o trabalho.
fonte
Você pode ver se o objeto tem forma ou não
fonte