2009-06-01 19 views
29

So che c'è una soluzione semplice a questo ma non riesco a trovarlo al momento.Come faccio a sapere se una matrice numpy contiene numeri interi?

Dato un array numpy, ho bisogno di sapere se l'array contiene numeri interi.

Controllare il dtype per-se non è sufficiente, in quanto vi sono più tipi di int (int8, int16, int32, int64 ...).

+0

Specificare se si desidera verificare se il ** tipo ** è un numero intero o se il ** valore ** è un numero intero (vedere [la mia soluzione] (http://stackoverflow.com/a/7236784/866 mila sette)). –

risposta

36

Trovato nel numero numpy book! Pagina 23:

Gli altri tipi nella gerarchia definiscono determinate categorie di tipi. Queste categorie possono essere utili per verificare se l'oggetto restituito da self.dtype.type è di una particolare classe (utilizzando issubclass).

issubclass(n.dtype('int8').type, n.integer) 
>>> True 
issubclass(n.dtype('int16').type, n.integer) 
>>> True 
+2

'issubclass (np.float64, np.floating)' per i tipi a virgola mobile – Temak

+0

Bello, funziona. Sintassi alternativa (quando si ha a che fare con un array): 'issubclass (label_array.dtype.type, np.integer)' – Peter

7

Questo funziona anche:

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

Per dtype senza segno, tipo = 'u'. Un test più generale dovrebbe essere: ** some_dtype.kind in ('u', 'i') ** –

+1

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

14

Controllando per un tipo intero non funziona per galleggianti che sono numeri interi, ad esempio 4. migliore soluzione è np.equal(np.mod(x, 1), 0), come in: funzione

>>> 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 di Numpy() può essere utilizzato come segue:

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) 

Risultati:

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. Tieni presente che gli elementi di un array hanno sempre lo stesso tipo di dati.

3

Mentre the accepted answer from 2009 è ancora valido, non v'è a new and enhanced solution come di Numpy v0.19, pubblicato nel settembre 2014:

Tutti i tipi di NumPy numerici sono ora registrati con il tipo di gerarchia nel modulo numeri pitone.

Ciò consente di verificare lo dtype contro Python Numeric abstract base classes.

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

è possibile testare contro numbers.Complex, numbers.Real e numbers.Integral.

P.S. Dato che non è più necessario accedere a .type ora è possibile abbreviare la linea di alcuni caratteri. ;)

+0

'isinstance (np.dtype (' int8 '), numbers.Integral)' ti dà ancora 'False', quindi non vedo un modo per non usare' .type' –

Problemi correlati