web-dev-qa-db-fra.com

ValueError lors de la vérification si la variable est None ou numpy.array

Je voudrais vérifier si la variable est None ou numpy.array. J'ai implémenté la fonction check_a pour le faire.

def check_a(a):
    if not a:
        print "please initialize a"

a = None
check_a(a)
a = np.array([1,2])
check_a(a)

Mais, ce code soulève ValueError. Quelle est la voie directe?

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()
79
rkjt50r983

Utiliser not a pour vérifier si a est None suppose que les autres valeurs possibles de a ont une valeur de vérité de True. Cependant, la plupart des tableaux NumPy n'ont pas du tout de valeur de vérité et not ne peut pas leur être appliqué.

Si vous voulez vérifier si un objet est None, la méthode la plus générale et la plus fiable consiste à utiliser littéralement un contrôle is par rapport à None:

if a is None:
    ...
else:
    ...

Cela ne dépend pas des objets ayant une valeur de vérité, donc cela fonctionne avec les tableaux NumPy.

Notez que le test doit être is, pas ==. is est un test d'identité d'objet. == est ce que les arguments disent, et les tableaux NumPy disent que c'est une comparaison d'égalité élémentaire diffusée, produisant un tableau booléen:

>>> 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()

De l'autre côté, si vous voulez tester si un objet est un tableau NumPy, vous pouvez tester son type:

# Careful - the type is np.ndarray, not np.array. np.array is a factory function.
if type(a) is np.ndarray:
    ...
else:
    ...

Vous pouvez également utiliser isinstance, qui renverra également True pour les sous-classes de ce type (si c'est ce que vous voulez). Compte tenu de la gravité et de l'incompatibilité de np.matrix, vous ne voudrez peut-être pas cela:

# Again, ndarray, not array, because array is a factory function.
if isinstance(a, np.ndarray):
    ...
else:
    ...    
135
Jerfov2

Vous pouvez voir si l'objet a une forme ou non

def check_array(x):
    try:
        x.shape
        return True
    except:
        return False
1
Itachi

Si vous essayez de faire quelque chose de très similaire, a is not None, le même problème se pose: Numpy se plaint de devoir utiliser a.any ou a.all. Une solution de contournement est à faire:

if not (a is None):
    pass

Pas trop joli, mais ça fait le boulot.

0
mimoralea