Me gustaría comprobar si la variable es None o numpy.array. Implementé una check_afunción para hacer esto.
def check_a(a):
if not a:
print "please initialize a"
a = None
check_a(a)
a = np.array([1,2])
check_a(a)
Pero este código genera ValueError. ¿Cuál es la forma más sencilla?
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()

ValueErrores una de lasnumpypreguntas más frecuentes . Significa quenot aproduce una matriz booleana, con (en este caso) 2 valores. ¡Esta matriz booleana no se puede utilizar comoifcondición! Lais Nonealternativa es bueno saber, pero se debe entender también este error.not, por lo que el error realmente ocurre cuandonotintenta tratar la matriz como un solo booleano y descubre que no puede. Si lo hubiera sido~a, habría usado la sobrecarga de NumPy y habría fallado alifintentar usar la matriz negada como un único booleano.Respuestas:
Usar
not apara probar siaseNoneasume que los otros valores posibles deatienen un valor de verdad deTrue. Sin embargo, la mayoría de las matrices NumPy no tienen ningún valor de verdad ynotno se pueden aplicar a ellas.Si desea probar si un objeto lo es
None, la forma más general y confiable es usar literalmente unaisverificación contraNone:Esto no depende de que los objetos tengan un valor de verdad, por lo que funciona con matrices NumPy.
Tenga en cuenta que la prueba tiene que ser
is, no==.ises una prueba de identidad de objeto.==es lo que los argumentos dicen que es, y las matrices NumPy dicen que es una comparación de igualdad de elementos transmitida, produciendo una matriz booleana:Por otro lado, si desea probar si un objeto es una matriz NumPy, puede probar su tipo:
También puede usar
isinstance, que también devolverá lasTruesubclases de ese tipo (si eso es lo que desea). Teniendo en cuenta lo terrible e incompatible quenp.matrixes, es posible que en realidad no desee esto:fuente
Si está intentando hacer algo muy similar
a is not None, surge el mismo problema. Es decir, Numpy se queja de que hay que usara.anyoa.all.Una solución alternativa es hacer:
No es demasiado bonito, pero funciona.
fuente
Puedes ver si el objeto tiene forma o no
fuente