2009-06-01 22 views
29

Sé que hay una solución simple para esto, pero parece que no puede encontrarlo en este momento.¿Cómo averiguo si una matriz numpy contiene enteros?

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 tipos de int (int8, int16, int32, int64 ...).

+0

Especifique si desea comprobar si el ** tipo ** es un número entero, o si el ** valor ** es un número entero (consulte [mi solución] (http://stackoverflow.com/a)/7236784/866007)). –

Respuesta

36

¡Lo encontró en numpy book! 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 
+2

'issubclass (np.float64, np.floating)' para los tipos de coma flotante – Temak

+0

Agradable, funciona. Sintaxis alternativa (cuando se trata de una matriz): 'issubclass (label_array.dtype.type, np.integer)' – Peter

7

Esto también funciona:

n.dtype('int8').kind == 'i' 
+4

Para unsigned dtype, kind = 'u'. Una prueba más general debería ser: ** some_dtype.kind in ('u', 'i') ** –

+1

@Juh_, o simplemente 'some_dtype.kind in 'ui'' – Garrett

14

Comprobación de un tipo entero no funciona para flotadores que son números enteros, por ejemplo 4. solución mejor es np.equal(np.mod(x, 1), 0), como en: función

>>> 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 
4

issubdtype de Numpy() se puede utilizar como sigue:

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 

PS. Tenga en cuenta que los elementos de una matriz son siempre del mismo tipo de datos.

3

Mientras the accepted answer from 2009 sigue siendo válida, no es tan a new and enhanced solution de Numpy v0.19, publicado en septiembre de 2014:

Todos los tipos numpy numéricos están registradas con la jerarquía de tipos en el módulo de números de pitón.

Esto permite comprobar el dtype contra el Numeric abstract base classes de Python.

isinstance(np.dtype('int8'), numbers.Integral) 
issubclass(np.dtype('int32').type, numbers.Integral) 

usted puede probar contra numbers.Complex, numbers.Real y numbers.Integral.

P.S. Como ya no necesita acceder a .type, puede acortar su línea ahora con unos pocos caracteres. ;)

+0

'isinstance (np.dtype (' int8 '), numbers.Integral)' todavía te da 'False', por lo que no veo una forma de no usar' .type' –

Cuestiones relacionadas