python - ValueError al verificar si la variable es None o numpy.array
is-empty (3)
Me gustaría verificar si la variable es None o numpy.array.
He implementado la función
check_a
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 el camino directo?
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()
El uso de
not a
para probar si
a
es
None
supone que los otros valores posibles de
a
tienen un valor de verdad de
True
.
Sin embargo, la mayoría de las matrices NumPy no tienen un valor de verdad en absoluto, y
not
se les puede aplicar.
Si desea probar si un objeto es
None
, la forma más general y confiable es usar literalmente una comprobación de
is
contra
None
:
if a is None:
...
else:
...
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 dicen los argumentos, y las matrices NumPy dicen que es una comparación de igualdad de elementos emitida, produciendo una matriz booleana:
>>> a = numpy.arange(5)
>>> a == None
array([False, False, False, False, False])
>>> if a == None:
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()
Por otro lado, si desea probar si un objeto es una matriz NumPy, puede probar su tipo:
# Careful - the type is np.ndarray, not np.array. np.array is a factory function.
if type(a) is np.ndarray:
...
else:
...
También puede usar
isinstance
, que también devolverá
True
para subclases de ese tipo (si eso es lo que desea).
Teniendo en cuenta lo terrible e incompatible que es
np.matrix
, es posible que no desee esto:
# Again, ndarray, not array, because array is a factory function.
if isinstance(a, np.ndarray):
...
else:
...
Puedes ver si el objeto tiene forma o no
def check_array(x):
try:
x.shape
return True
except:
return False
Si está tratando de hacer algo muy similar a
a is not None
, surge el mismo problema: Numpy se queja de que uno debe usar
a.any
o
a.all
.
Una solución alternativa es hacer:
if not (a is None):
pass
No es muy bonito, pero hace el trabajo.