Comment identifier les types numpy en python?

Comment peut-on déterminer de façon fiable si un objet a un type numpy?

je me rends compte 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'il ne soit appelé avec un type numpy. cela apparaît dans la solution à une autre question, mais je pense que le problème général de déterminer si un objet a un type numpy est assez loin de ce question originale qu'ils devraient être séparés.

59
demandé sur Community 2012-09-24 20:49:46

5 réponses

utilisez la fonction type pour obtenir le type, alors vous pouvez utiliser la propriété __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
67
répondu abarnert 2012-09-24 17:36:59

la solution que j'ai trouvée est:

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

Toutefois, il n'est pas 100% clair que tous les numpy types sont garantis pour être np.ndarray ou np.generic , et ce n'est probablement pas la version robuste.

37
répondu Douglas B. Staple 2012-09-25 01:52:00

question ancienne 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 ce 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écuter le isinstance bool. Bien que cela puisse sembler simple, si vous faites quelques calculs à travers différents types de données, Cette petite vérification peut servir de test rapide avant de commencer une opération vectorielle.

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

import numpy as np

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

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

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

isinstance(arr,np.ndarray)
11
répondu Linwoodc3 2016-10-16 02:30:37

pour obtenir le type, utilisez la fonction type intégrée. Avec l'opérateur in , vous pouvez tester si le type est un type numpy en vérifiant s'il contient la chaîne 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 , soit dit en passant. Très pratique pour une utilisation interactive et des tests rapides.)

7
répondu Roland Smith 2012-09-24 17:04:47

ça dépend de ce que vous cherchez.

  • si vous voulez tester si une séquence est réellement une ndarray , un isinstance(..., np.ndarray) est probablement le plus facile. Assurez-vous de ne pas recharger num py en arrière-plan car le module peut être différent, mais sinon, vous devriez être OK. MaskedArrays , matrix , recarray sont toutes les sous-classes de ndarray , donc vous devriez être réglé.
  • Si vous voulez tester si une scalaire est un numpy scalaire, les choses deviennent un peu plus compliquées. Vous pouvez vérifier s'il a un attribut shape et un attribut dtype . Vous pouvez comparer son dtype avec les dtypes de base, dont vous trouverez la liste dans np.core.numerictypes.genericTypeRank . Notez que les éléments de cette liste sont des chaînes, donc vous devez faire un tested.dtype is np.dtype(an_element_of_the_list) ...
5
répondu Pierre GM 2012-09-24 18:20:19