J'ai besoin de tester si une variable est de type int
, ou l'un des np.int*
, np.uint*
, De préférence en utilisant une seule condition ( ie non or
).
Après quelques tests, je suppose que:
isinstance(n, int)
ne correspondra qu'à int
et np.int32
(ou np.int64
selon la plateforme),np.issubdtype(type(n), int)
semble correspondre à tous les int
et np.int*
, mais ne correspond pas à np.uint*
.Cela conduit à deux questions: np.issubdtype
Correspondra-t-il à n'importe quel type d'entités signées? Peut déterminer en un seul chèque si un numéro est une sorte d'int. Signé ou non signé?
Il s'agit de tester pour entiers, le test devrait retourner False
pour les flottants.
NumPy fournit des classes de base que vous pouvez/devez utiliser pour la vérification des sous-types, plutôt que les types Python.
Utilisez np.integer
Pour rechercher toute instance d'entiers signés ou non signés.
Utilisez np.signedinteger
Et np.unsignedinteger
Pour vérifier les types signés ou non signés.
>>> np.issubdtype(np.uint32, np.integer)
True
>>> np.issubdtype(np.uint32, np.signedinteger)
False
>>> np.issubdtype(int, np.integer)
True
Tous les types de nombres flottants ou complexes renverront False
lorsqu'ils seront testés.
np.issubdtype(np.uint*, int)
sera toujours False
car le Python int
est un type signé.
Une référence utile montrant la relation entre toutes ces classes de base se trouve dans la documentation ici .
Je suggère de passer un tuple de types à python isinstance()
fonction intégrée. Et en ce qui concerne votre question sur np.issubtype()
cela ne correspond à aucun type d'entiers signés, il détermine si une classe est une sous-classe d'une deuxième classe. Et puisque tous les types entiers (int8, int32, etc.) sont des sous-classes de int
, il renverra True si vous passez l'une de ces classes tapez avec int
.
Voici un exemple:
>>> a = np.array([100])
>>>
>>> np.issubdtype(type(a[0]), int)
True
>>> isinstance(a[0], (int, np.uint))
True
>>> b = np.array([100], dtype=uint64)
>>>
>>> isinstance(b[0], (int, np.uint))
True
En outre, en tant qu'approche plus générique (n'est pas appropriée lorsque vous souhaitez uniquement faire correspondre certains types spécifiques), vous pouvez utiliser np.isreal()
:
>>> np.isreal(a[0])
True
>>> np.isreal(b[0])
True
>>> np.isreal(2.4) # This might not be the result you want
True
>>> np.isreal(2.4j)
False