Me gustaría comprobar si la variable es None o numpy.array. Implementé una check_a
funció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()
ValueError
es una de lasnumpy
preguntas más frecuentes . Significa quenot a
produce una matriz booleana, con (en este caso) 2 valores. ¡Esta matriz booleana no se puede utilizar comoif
condición! Lais None
alternativa es bueno saber, pero se debe entender también este error.not
, por lo que el error realmente ocurre cuandonot
intenta 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 alif
intentar usar la matriz negada como un único booleano.Respuestas:
Usar
not a
para probar sia
seNone
asume que los otros valores posibles dea
tienen un valor de verdad deTrue
. Sin embargo, la mayoría de las matrices NumPy no tienen ningún valor de verdad ynot
no se pueden aplicar a ellas.Si desea probar si un objeto lo es
None
, la forma más general y confiable es usar literalmente unais
verificació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==
.is
es 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á lasTrue
subclases de ese tipo (si eso es lo que desea). Teniendo en cuenta lo terrible e incompatible quenp.matrix
es, 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.any
oa.all
.Una solución alternativa es hacer:
No es demasiado bonito, pero funciona.
fuente
Puedes ver si el objeto tiene forma o no
fuente