Comment faire pour déterminer si un nombre est n'importe quel type de int (core ou numpy, signé ou non)?
J'ai besoin de tester si une variable est de type int
, ou de l'une de np.int*
, np.uint*
, de préférence à l'aide d'un seul état (c'est à dire pas or
).
Après quelques tests, je suppose que:
isinstance(n, int)
ne correspondentint
etnp.int32
(ounp.int64
en fonction de plate-forme),np.issubdtype(type(n), int)
semble correspondre à tous lesint
etnp.int*
, mais ne correspond pas ànp.uint*
.
Cela conduit à deux questions: sera np.issubdtype
match tout signé ints? Pouvez déterminer dans un seul chèque de savoir si un nombre est un type signed ou unsigned int?
C'est sur le test pour entiers, le test doit être de retour False
pour float-aime.
Vous devez vous connecter pour publier un commentaire.
NumPy fournit des classes de base que vous pouvez/devez utiliser pour le sous-type de vérification, plutôt que les types de Python.
Utilisation
np.integer
à vérifier pour toutes les instances de soit signé ou non signé entiers.Utilisation
np.signedinteger
etnp.unsignedinteger
pour vérifier les types signés ou non signés types.Tous flottante ou complexes certain nombre de types de retour
False
lors d'un essai.np.issubdtype(np.uint*, int)
sera toujoursFalse
parce que le Pythonint
est un type signé.Une référence utile en montrant la relation entre l'ensemble de ces classes de base est trouvé dans la documentation ici.
isinstance(n, (int, np.integer))
.Je suggère le passage d'un n-uplet de types de python
isinstance()
fonction intégrée. Et en ce qui concerne votre question surnp.issubtype()
il ne correspond à aucune sorte de signé ints, de déterminer si une classe est une sous-classe de seconde classe. Et puisque tous les types d'entiers (int8, int32, etc.) sont des sous-classes deint
il retournera True si vous passez un de ces type avecint
.Voici un exemple:
Aussi, comme une approche plus générique (ne convient pas lorsque vous ne voulez correspondre à certains types spécifiques), vous pouvez utiliser
np.isreal()
:np.issutype()
. Je suppose que les types d'inscription dansisinstance()
pourrait fonctionner, mais je veux éviter, car cela implique de faireisinstance(n, (int, np.int, np.int0, np.int8, np.int16, <etc.>, np.uint, <etc.>)
. Je ne peux pas penser moins pythonic.np.integer
comme suggéré par ajcr fonctionne très bien; merci!