Come convertire array numpy float 2D in array numpy 2D int?


303

Come convertire l'array numpy reale in array int numpy? Ho provato ad usare la mappa direttamente sull'array ma non ha funzionato.

Risposte:


405

Usa il astypemetodo

>>> x = np.array([[1.0, 2.3], [1.3, 2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> x.astype(int)
array([[1, 2],
       [1, 2]])

30
Assicurati solo di non avere np.info np.nannel tuo array, poiché hanno risultati sorprendenti. Ad esempio, np.array([np.inf]).astype(int)uscite array([-9223372036854775808]).
Garrett,

Sulla mia macchina, np.array([np.inf]).astype(int), np.array([-np.inf]).astype(int), e np.array([np.nan]).astype(int)tutto restituire la stessa cosa. Perché?
BallpointBen

1
@BallpointBen: nane infsono valori in virgola mobile e non possono essere convertiti in modo significativo in int. Come il commento prima delle tue note, ci sarà un comportamento sorprendente e non credo che il comportamento preciso sia ben definito. Se si desidera mappare nane infdeterminati valori, è necessario farlo da soli.
BrenBarn,

Si noti che x.astype (int) [0] [0] non è di tipo int. Lo è numpy.int32.
Chris Anderson,

Si noti che sebbene questo converta l'array in ints, la risposta di @fhtuft che potrebbe comportare meno sorprese
Nathan Musoke,

66

Alcune funzioni intorpidite su come controllare l'arrotondamento: rint , floor , trunc , ceil . a seconda di come si desidera arrotondare i float, su, giù o al più vicino int.

>>> x = np.array([[1.0,2.3],[1.3,2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> y = np.trunc(x)
>>> y
array([[ 1.,  2.],
       [ 1.,  2.]])
>>> z = np.ceil(x)
>>> z
array([[ 1.,  3.],
       [ 2.,  3.]])
>>> t = np.floor(x)
>>> t
array([[ 1.,  2.],
       [ 1.,  2.]])
>>> a = np.rint(x)
>>> a
array([[ 1.,  2.],
       [ 1.,  3.]])

Per rendere uno di questi in int, o uno degli altri tipi in numpy, astype (come ha risposto BrenBern):

a.astype(int)
array([[1, 2],
       [1, 3]])

>>> y.astype(int)
array([[1, 2],
       [1, 2]])

2
Esattamente quello che stavo cercando. astypeè spesso troppo generico e penso che probabilmente sia più utile quando si eseguono conversioni intx - inty. Quando voglio fare la conversione float, int è la possibilità di scegliere il tipo di arrotondamento.
Bakuriu,

11
Quindi il modo più semplice per convertire in sicurezza quasi-ints simili 7.99999a ints come 8, è np.rint(arr).astype(int)?
endolith,

in qualche modo numpy per renderlo uint8?
Ryan,

2
@Ryanastype(np.uint8)
Chris Anderson,

15

puoi usare np.int_:

>>> x = np.array([[1.0, 2.3], [1.3, 2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> np.int_(x)
array([[1, 2],
       [1, 2]])

12

Se non sei sicuro che il tuo input sarà un array Numpy, puoi usare asarraycon dtype=intinvece di astype:

>>> np.asarray([1,2,3,4], dtype=int)
array([1, 2, 3, 4])

Se l'array di input ha già il tipo corretto, asarrayevita la copia dell'array mentre astypenon lo fa (se non specificato copy=False):

>>> a = np.array([1,2,3,4])
>>> a is np.asarray(a)  # no copy :)
True
>>> a is a.astype(int)  # copy :(
False
>>> a is a.astype(int, copy=False)  # no copy :)
True
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.