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
.
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.
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
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)
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.
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