python numpy is-empty

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.