Convierta una matriz flotante 2D en una matriz int 2D en NumPy

3 minutos de lectura

avatar de usuario
Shan

¿Cómo convierto una matriz NumPy flotante en una matriz NumPy int?

avatar de usuario
BrenBarn

Utilizar el astype mé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]])

  • Solo asegúrate de no tener np.info np.nan en su matriz, ya que tienen resultados sorprendentes. Por ejemplo, np.array([np.inf]).astype(int) salidas array([-9223372036854775808]).

    – Garrett

    22 de enero de 2015 a las 8:42

  • en mi máquina, np.array([np.inf]).astype(int), np.array([-np.inf]).astype(int)y np.array([np.nan]).astype(int) todos devuelven lo mismo. ¿Por qué?

    – BolígrafoBen

    14 mayo 2018 a las 20:47

  • @BallpointBen: nan y inf son valores de punto flotante y no se pueden convertir significativamente a int. Como señala el comentario anterior al suyo, habrá un comportamiento sorprendente, y no creo que el comportamiento preciso esté bien definido. Si quieres mapear nan y inf a ciertos valores, debe hacerlo usted mismo.

    – BrenBarn

    15 mayo 2018 a las 18:21

  • Tenga en cuenta que x.astype(int)[0][0] no es de tipo int. Es numpy.int32.

    – chris

    6 de junio de 2018 a las 19:34

  • Tenga en cuenta que, aunque esto convierte la matriz en enteros, la respuesta de @fhtuft que puede resultar en menos sorpresas

    –Nathan Musoke

    15 de abril de 2020 a las 18:07

avatar de usuario
fhtuft

Algunas funciones numpy sobre cómo controlar el redondeo: imprimir, piso,tronco, hacer techo. dependiendo de cómo desee redondear los flotadores, hacia arriba, hacia 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, un tipo (como respondió BrenBern):

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

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

  • Exactamente lo que estaba buscando. astype a menudo es demasiado genérico, y creo que probablemente sea más útil cuando se realizan conversiones intx – inty. Cuando quiero hacer float – conversión int poder elegir el tipo de redondeo es una buena característica.

    – Bakuriu

    11 de septiembre de 2012 a las 7:03

  • Así que la forma más sencilla de convertir casi-ints de forma segura como 7.99999 a ints como 8es np.rint(arr).astype(int)?

    – endolito

    12/10/2012 a las 18:53

  • ¿alguna forma en numpy para hacerlo uint8?

    – Ryan

    6 de febrero de 2018 a las 12:47

  • @Ryan astype(np.uint8)

    – chris

    6 de junio de 2018 a las 19:28

  • ¿Puede comentar también sobre el tiempo de ejecución de estos métodos?

    – Divyanshu Srivastava

    26 de marzo a las 21:59


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

Si no está seguro de que su entrada sea una matriz Numpy, puede usar asarray con dtype=int en vez de astype:

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

Si la matriz de entrada ya tiene el dtype correcto, asarray evita la copia de la matriz mientras astype no lo hace (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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad