web-dev-qa-db-fra.com

Comment vérifier si un type numpy est intégral?

Comment vérifier si un type numpy est intégral? J'ai essayé:

issubclass(np.int64, numbers.Integral)

mais cela donne False.


Mise à jour: il donne maintenant True.

23
Neil G

Numpy a une hiérarchie de types de données similaire à une hiérarchie de classes (les types scalaires ont en réalité une hiérarchie de classes reconnue qui reflète la hiérarchie de types). Vous pouvez utiliser np.issubdtype(some_dtype, np.integer) pour vérifier si un type est un type entier. Notez que, comme la plupart des fonctions consommant des types de types, np.issubdtype() convertira ses arguments en types, de sorte que tout ce qui peut créer un type avec le constructeur np.dtype() peut être utilisé.

http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html#specifying-and-constructing-data-types

>>> import numpy as np
>>> np.issubdtype(np.int32, np.integer)
True
>>> np.issubdtype(np.float32, np.integer)
False
>>> np.issubdtype(np.complex64, np.integer)
False
>>> np.issubdtype(np.uint8, np.integer)
True
>>> np.issubdtype(np.bool, np.integer)
False
>>> np.issubdtype(np.void, np.integer)
False

Dans une future version de numpy, nous veillerons à ce que les types scalaires soient enregistrés avec les ABC numbers appropriés.

38
Robert Kern

Notez que np.int64 n'est pas un type, mais un type Python. Si vous avez un type réel (accessible via le champ dtype d'un tableau), vous pouvez utiliser le np.typecodes dict que vous avez découvert:

my_array.dtype.char in np.typecodes['AllInteger']

Si vous ne possédez qu'un type tel que np.int64, vous pouvez d'abord obtenir un type correspondant au type, puis l'interroger comme ci-dessus:

>>> np.dtype(np.int64).char in np.typecodes['AllInteger']
True
14
user4815162342

En me basant sur les réponses et les commentaires précédents, j’ai décidé d’utiliser l’attribut type de l’objet dtype avec la méthode issubclass() intégrée de Python et le module numbers:

import numbers
import numpy

assert issubclass(numpy.dtype('int32').type, numbers.Integral)
assert not issubclass(numpy.dtype('float32').type, numbers.Integral)
2
Johann

En fonction du cas d'utilisation, le ducktyping

import operator
int = operator.index(number)

est une bonne méthode à mon avis. De plus, il n’a besoin de rien de particulier numpy.

Le seul inconvénient est que, dans certains cas, vous devriez try/except-le.

1
seberg

Voulez-vous dire la ligne 17?

In [13]:

import numpy as np
A=np.array([1,2,3])
In [14]:

A.dtype
Out[14]:
dtype('int32')
In [15]:

isinstance(A, np.ndarray) #A is not an instance of int32, it is an instance of ndarray
Out[15]:
True
In [16]:

A.dtype==np.int32 #but its dtype is int32
Out[16]:
True
In [17]:

issubclass(np.int32, int) #and int32 is a subclass of int
Out[17]:
True
0
CT Zhu