145 votes

Comment identifier les types numpy en python ?

Comment peut-on déterminer de manière fiable si un objet a un type numpy ?

Je réalise que cette question va à l'encontre de la philosophie du duck typing, mais l'idée est de s'assurer qu'une fonction (qui utilise scipy et numpy) ne retourne jamais un type numpy à moins qu'elle ne soit appelée avec un type numpy. Ce point est abordé dans la solution d'une autre question, mais je pense que le problème général de déterminer si un objet a un type numpy est suffisamment éloigné de cette question originale pour qu'ils soient séparés.

152voto

abarnert Points 94246

Utilisez la fonction intégrée type pour obtenir le type, vous pouvez alors utiliser la fonction __module__ pour savoir où il a été défini :

>>> import numpy as np
a = np.array([1, 2, 3])
>>> type(a)
<type 'numpy.ndarray'>
>>> type(a).__module__
'numpy'
>>> type(a).__module__ == np.__name__
True

121voto

Douglas B. Staple Points 1748

La solution que j'ai trouvée est la suivante :

isinstance(y, (np.ndarray, np.generic) )

Cependant, Ce n'est pas clair à 100%. que tous les types numpy sont garantis comme étant soit np.ndarray o np.generic et ce n'est probablement pas une version robuste.

28voto

Linwoodc3 Points 364

Vieille question mais j'ai trouvé une réponse définitive avec un exemple. Ça ne peut pas faire de mal de garder les questions fraîches, car j'ai eu le même problème et je n'ai pas trouvé de réponse claire. La clé est de s'assurer que vous avez numpy importé, puis exécutez le isinstance bool. Bien que cela puisse sembler simple, si vous effectuez des calculs sur différents types de données, cette petite vérification peut servir de test rapide avant de commencer une opération numpy vectorisée.

##################
# important part!
##################

import numpy as np

####################
# toy array for demo
####################

arr = np.asarray(range(1,100,2))

########################
# The instance check
######################## 

isinstance(arr,np.ndarray)

12voto

Pierre GM Points 7792

Cela dépend en fait de ce que vous recherchez.

  • Si vous voulez tester si une séquence est réellement une ndarray , a isinstance(..., np.ndarray) est probablement le plus facile. Assurez-vous de ne pas recharger numpy en arrière-plan car le module peut être différent, mais sinon, vous devriez être OK. MaskedArrays , matrix , recarray sont toutes des sous-classes de ndarray donc vous devriez être prêt.
  • Si vous voulez tester si un scalaire est un scalaire numpy, les choses deviennent un peu plus compliquées. Vous pourriez vérifier s'il possède un shape y un dtype attribut. Vous pouvez comparer son dtype aux dtypes de base, dont vous pouvez trouver la liste dans np.core.numerictypes.genericTypeRank . Notez que les éléments de cette liste sont des chaînes de caractères, il faudrait donc faire un tested.dtype is np.dtype(an_element_of_the_list) ...

8voto

Roland Smith Points 10392

Pour obtenir le type, utilisez la fonction intégrée type fonction. Avec le in vous pouvez tester si le type est un type numpy en vérifiant s'il contient la chaîne de caractères numpy ;

In [1]: import numpy as np

In [2]: a = np.array([1, 2, 3])

In [3]: type(a)
Out[3]: <type 'numpy.ndarray'>

In [4]: 'numpy' in str(type(a))
Out[4]: True

(Cet exemple a été exécuté dans IPython d'ailleurs. Très pratique pour une utilisation interactive et des tests rapides).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X