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):
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]])
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
np.inf
onp.nan
de tu matriz, ya que tienen resultados sorprendentes. Por ejemplo,np.array([np.inf]).astype(int)
salidasarray([-9223372036854775808])
.np.array([np.inf]).astype(int)
,np.array([-np.inf]).astype(int)
, ynp.array([np.nan]).astype(int)
todo volverá al mismo. ¿Por qué?nan
yinf
son 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 mapearnan
yinf
ciertos valores, debe hacerlo usted mismo.int
. Esnumpy.int32
.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.
Para hacer uno de esto en int, o uno de los otros tipos en numpy, astype (como respondió BrenBern):
fuente
astype
a 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.7.99999
en entradas como entradas8
esnp.rint(arr).astype(int)
?astype(np.uint8)
puedes usar
np.int_
:fuente
Si no está seguro de que su entrada será una matriz Numpy, puede usar
asarray
con endtype=int
lugar deastype
:Si la matriz de entrada ya tiene el tipo de letra correcto,
asarray
evita la copia de la matriz yastype
no la tiene (a menos que especifiquecopy=False
):fuente