¿Cómo convertir una matriz numpy flotante 2D a una matriz numpy int 2D?

303

¿Cómo convertir una matriz numpy real en una matriz numpy int? Intenté usar el mapa directamente a la matriz, pero no funcionó.

Shan
fuente

Respuestas:

405

Usa el astypemétodo.

>>> 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]])
BrenBarn
fuente
30
Solo asegúrate de que no tienes np.info np.nande tu matriz, ya que tienen resultados sorprendentes. Por ejemplo, np.array([np.inf]).astype(int)salidas array([-9223372036854775808]).
Garrett
En mi máquina, np.array([np.inf]).astype(int), np.array([-np.inf]).astype(int), y np.array([np.nan]).astype(int)todo volverá al mismo. ¿Por qué?
BallpointBen
1
@BallpointBen: nany infson valores de punto flotante y no se pueden convertir significativamente a int. Como señala el comentario antes del suyo, habrá un comportamiento sorprendente, y no creo que el comportamiento preciso esté bien definido. Si desea mapear nany infciertos valores, debe hacerlo usted mismo.
BrenBarn
Tenga en cuenta que x.astype (int) [0] [0] no es de tipo int. Es numpy.int32.
Chris Anderson
Tenga en cuenta que aunque esto convierte la matriz a ints, la respuesta de @ fhtuft puede resultar en menos sorpresas
Nathan Musoke
66

Algunas funciones numpy para controlar el redondeo: rint , floor , trunc , ceil . dependiendo de cómo desee redondear los flotadores, arriba, abajo o al int más cercano.

>>> 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.]])

Para hacer uno de esto en int, o uno de los otros tipos en numpy, astype (como respondió BrenBern):

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

>>> y.astype(int)
array([[1, 2],
       [1, 2]])
fhtuft
fuente
2
Exactamente lo que estaba buscando. astypea menudo es demasiado genérico, y creo que probablemente sea más útil cuando se realizan conversiones intx - inty. Cuando quiero hacer flotante, la conversión int poder elegir el tipo de redondeo es una buena característica.
Bakuriu
11
Entonces, ¿la forma más sencilla de convertir de manera segura casi entradas 7.99999en entradas como entradas 8es np.rint(arr).astype(int)?
endolito el
de alguna manera en numpy para que sea uint8?
Ryan
2
@ Ryanastype(np.uint8)
Chris Anderson
15

puedes usar 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]])
Adicto al alcohol
fuente
12

Si no está seguro de que su entrada será una matriz Numpy, puede usar asarraycon en dtype=intlugar de astype:

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

Si la matriz de entrada ya tiene el tipo de letra correcto, asarrayevita la copia de la matriz y astypeno la tiene (a menos que especifique 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
1 ''
fuente