Comment déterminer de manière fiable si un objet a un type numpy?
Je me rends compte que cette question va à l'encontre de la philosophie du typage canard, mais l'idée est de s'assurer qu'une fonction (qui utilise scipy et numpy) ne renvoie jamais un type numpy à moins qu'elle ne soit appelée avec un type numpy. Cela vient 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 suffisamment éloigné de cette question originale pour qu'ils devraient être séparés.
python
numpy
duck-typing
dynamic-typing
Douglas B. Staple
la source
la source
Réponses:
Utilisez la
type
fonction intégrée pour obtenir le type, puis vous pouvez utiliser la__module__
propriété pour savoir où elle a été définie:la source
La solution que j'ai trouvée est:
Cependant, il n'est pas clair à 100% que tous les types numpy sont garantis soit
np.ndarray
ounp.generic
, et ce n'est probablement pas une version robuste.la source
dir(numpy)
sur les types et les fonctions intégrées (et les classes, mais je ne pense pas qu'il en ait) et l'utiliser pour générer un tuple àisinstance
contre, ce qui serait robuste. (Je crois que vous pouvez passer des fonctions intégrées à isinstance, qu'il s'agisse en fait de constructeurs de type ou non, mais vous devrez vérifier cela.)Ancienne question mais j'ai trouvé une réponse définitive avec un exemple. Je ne peux pas faire de mal à 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 vous assurer que vous avez
numpy
importé, puis d'exécuter leisinstance
booléen. 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 vectorisée numpy.la source
Cela dépend en fait de ce que vous recherchez.
ndarray
, aisinstance(..., np.ndarray)
est probablement le plus simple. 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 les sous - classes dendarray
, vous devriez donc être réglé.shape
et undtype
attribut. Vous pouvez le comparerdtype
aux dtypes de base, dont vous pouvez trouver la listenp.core.numerictypes.genericTypeRank
. Notez que les éléments de cette liste sont des chaînes, vous devrez donc faire untested.dtype is np.dtype(an_element_of_the_list)
...la source
numpy
type" et que vous pouvez définir ce qu'est ce quelque chose, c'est mieux que les autres réponses. Et dans la plupart des cas, vous devriez rechercher quelque chose de spécifique que vous pouvez définir.Pour obtenir le type, utilisez la
type
fonction intégrée . Avec l'in
opérateur, vous pouvez tester si le type est un type numpy en vérifiant s'il contient la chaînenumpy
;(Cet exemple a été exécuté en IPython , d'ailleurs. Très pratique pour une utilisation interactive et des tests rapides.)
la source
Notez que le
type(numpy.ndarray)
est untype
lui-même et faites attention aux types booléens et scalaires. Ne vous découragez pas trop si ce n'est pas intuitif ou facile, c'est une douleur au début.Voir aussi: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.dtypes.html - https://github.com/machinalis/mypy-data/tree/master/numpy- mypy
Amusez-vous avec les booléens:
Plus amusant avec les types scalaires, voir: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.scalars.html#arrays-scalars-built-in
la source