python - matrices - numpy dtype
¿Cómo compruebo si un dtype numpy es integral? (6)
¿Cómo compruebo si un dtype numpy es integral? Lo intenté:
issubclass(np.int64, numbers.Integral)
pero da False
.
Actualización: ahora da True
.
¿Te refieres a la línea 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
Aprovechando las respuestas y comentarios anteriores, me decidí a usar el atributo type
del objeto dtype
con el método de issubclass()
incorporado de Python y el módulo de numbers
:
import numbers
import numpy
assert issubclass(numpy.dtype(''int32'').type, numbers.Integral)
assert not issubclass(numpy.dtype(''float32'').type, numbers.Integral)
Dependiendo del caso de uso del patito
import operator
int = operator.index(number)
Es un buen método en mi opinión. Además no necesita nada numpy específico.
La única desventaja es que en algunos casos tendrías que try
/ except
.
Esta no es una gran respuesta, pero una forma de verificar si una clase some_dtype
es un dtype integral (por ejemplo, np.int32
) es llamándola y np.int32
en una cadena:
str(dtype()) == ''0''
Los tipos de punto flotante dan 0.0
lugar.
Numpy tiene una jerarquía de tipos de datos similar a una jerarquía de clases (los tipos escalares en realidad tienen una jerarquía de clases auténtica que refleja la jerarquía de tipos de datos). Puede usar np.issubdtype(some_dtype, np.integer)
para probar si un dtype es un dtype entero. Tenga en cuenta que al igual que la mayoría de las funciones que consumen np.issubdtype()
, np.issubdtype()
convertirá sus argumentos en dtypes, por lo que se puede usar cualquier cosa que pueda hacer un dtype a través del constructor np.dtype()
.
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
En una versión futura de numpy, nos aseguraremos de que los tipos escalares estén registrados con los numbers
apropiados ABCs.
Tenga en cuenta que np.int64
no es un dtype, es un tipo Python. Si tiene un dtype real (accedido a través del campo dtype
de una matriz), puede hacer uso del np.typecodes
que descubrió:
my_array.dtype.kind in np.typecodes[''AllInteger'']
Si solo tiene un tipo como np.int64
, primero puede obtener un dtype que se corresponda con el tipo, y luego consultarlo como se muestra arriba:
>>> np.dtype(np.int64).kind in np.typecodes[''AllInteger'']
True