Como faço para descobrir se uma matriz numpy contém inteiros?
Pergunta
Eu sei que há uma solução simples para isso, mas não consigo encontrá-lo no momento.
Dada uma matriz numpy, eu preciso saber se a matriz contém números inteiros.
Verificar o dtipo por si só não é suficiente, uma vez que existem vários dtypes int (int8, int16, int32, int64 ...).
Solução
encontrou na numpy livro ! Página 23:
Os outros tipos na hierarquia de fi ne determinadas categorias de tipos. Essas categorias podem ser úteis para testar se ou não o objeto retornado por self.dtype.type é de uma determinada classe (usando issubclass).
issubclass(n.dtype('int8').type, n.integer)
>>> True
issubclass(n.dtype('int16').type, n.integer)
>>> True
Outras dicas
Verificar se há um tipo inteiro não funciona para carros alegóricos que são números inteiros, por exemplo, 4.
melhor solução é np.equal(np.mod(x, 1), 0)
, como em:
>>> 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
Isso também funciona:
n.dtype('int8').kind == 'i'
issubdtype de Numpy () função pode ser usado da seguinte maneira:
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. Tenha em mente que os elementos de um array são sempre do mesmo tipo de dados.
Enquanto a resposta aceita a partir de 2009 ainda é válido, há um novo e melhorado solução a partir de v0.19 numpy, lançado em setembro de 2014:
Todos os tipos numpy numéricos estão agora registrados com o tipo de hierarquia no módulo números python.
Isto permite verificar o dtype
contra Python do numéricos classes de base abstrata .
isinstance(np.dtype('int8'), numbers.Integral)
issubclass(np.dtype('int32').type, numbers.Integral)
Você pode testar contra numbers.Complex
, numbers.Real
e numbers.Integral
.
P.S. Como você não precisa de acesso .type
mais você pode encurtar sua linha por alguns personagens agora. ;)