python - transpuesta - numpy funciones
¿Cómo averiguo si una matriz numpy contiene números enteros? (5)
Sé que hay una solución simple para esto, pero parece que no puede encontrarlo en este momento.
Dada una matriz numpy, necesito saber si la matriz contiene enteros.
Comprobar el tipo de letra per-se no es suficiente, ya que hay varios int dtypes (int8, int16, int32, int64 ...).
¡Lo encontré en el libro numpy ! Página 23:
Los otros tipos en la jerarquía definen categorías particulares de tipos. Estas categorías pueden ser útiles para probar si el objeto devuelto por self.dtype.type es de una clase particular (usando issubclass).
issubclass(n.dtype(''int8'').type, n.integer)
>>> True
issubclass(n.dtype(''int16'').type, n.integer)
>>> True
Esto también funciona:
n.dtype(''int8'').kind == ''i''
La comprobación de un tipo de entero no funciona para flotantes que son enteros, por ejemplo, 4.
mejor solución es np.equal(np.mod(x, 1), 0)
, como en:
>>> import numpy as np
>>> def isinteger(x):
... return np.equal(np.mod(x, 1), 0)
...
>>> foo = np.array([0., 1.5, 1.])
>>> bar = np.array([-5, 1, 2, 3, -4, -2, 0, 1, 0, 0, -1, 1])
>>> isinteger(foo)
array([ True, False, True], dtype=bool)
>>> isinteger(bar)
array([ True, True, True, True, True, True, True, True, True,
True, True, True], dtype=bool)
>>> isinteger(1.5)
False
>>> isinteger(1.)
True
>>> isinteger(1)
True
La función issubdtype () de Numpy se puede usar de la siguiente manera:
import numpy as np
size=(3,3)
A = np.random.randint(0, 255, size)
B = np.random.random(size)
print ''Array A:/n'', A
print ''Integers:'', np.issubdtype(A[0,0], int)
print ''Floats:'', np.issubdtype(A[0,0], float)
print ''/nArray B:/n'', B
print ''Integers:'', np.issubdtype(B[0,0], int)
print ''Floats:'', np.issubdtype(B[0,0], float)
Resultados:
Array A:
[[ 9 224 33]
[210 117 83]
[206 139 60]]
Integers: True
Floats: False
Array B:
[[ 0.54221849 0.96021118 0.72322367]
[ 0.02207826 0.55162813 0.52167972]
[ 0.74106348 0.72457807 0.9705301 ]]
Integers: False
Floats: True
PD. Tenga en cuenta que los elementos de una matriz son siempre del mismo tipo de datos.
Si bien la respuesta aceptada a partir de 2009 sigue siendo válida, existe una solución nueva y mejorada a partir de Numpy v0.19, lanzada en septiembre de 2014:
Todos los tipos numpy numéricos ahora están registrados con la jerarquía de tipos en el módulo de números python.
Esto permite verificar el dtype
contra las clases base abstractas Numéricas de Python.
isinstance(np.dtype(''int8''), numbers.Integral)
issubclass(np.dtype(''int32'').type, numbers.Integral)
Puede probar contra numbers.Complex
numbers.Real
numbers.Complex
, numbers.Integral
. numbers.Real
y numbers.Integral
. numbers.Integral
.
PD Como ya no necesita acceder a .type
, ahora puede acortar su línea con unos pocos caracteres. ;)