¿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ó.

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

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.