web-dev-qa-db-fra.com

Comment déterminer si un nombre est n'importe quel type d'int (core ou numpy, signé ou non)?

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.

35
Arcturus B

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 .

enter image description here

47
Alex Riley

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
3
Kasramvd