Apenas certifique-se de que você não possui np.infou possui np.nanuma matriz, pois eles têm resultados surpreendentes. Por exemplo, np.array([np.inf]).astype(int)saídas array([-9223372036854775808]).
22415 Garrett
Na minha máquina, np.array([np.inf]).astype(int), np.array([-np.inf]).astype(int), e np.array([np.nan]).astype(int)tudo voltar a mesma coisa. Por quê?
precisa
1
@BallpointBen: nane infsão valores de ponto flutuante e não podem ser convertidos significativamente em int. Como observa o comentário antes do seu, haverá um comportamento surpreendente, e não acho que o comportamento preciso seja bem definido. Se você deseja mapear nane infpara determinados valores, você mesmo precisa fazer isso.
BrenBarn 15/05
Observe que x.astype (int) [0] [0] não é do tipo int. É numpy.int32.
Chris Anderson
Observe que, embora isso converta a matriz em ints, a resposta do @ fhtuft pode resultar em menos surpresas
Nathan Musoke
66
Algumas funções numpy para como controlar o arredondamento: rint , chão , trunc , ceil . dependendo de como você deseja arredondar os carros alegóricos, para cima, para baixo ou para o int mais próximo.
>>> 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 transformar um desses em int ou um dos outros tipos em numpy, astype (conforme respondido por BrenBern):
Exatamente o que eu estava procurando. astypegeralmente é muito genérico e acho que provavelmente é mais útil ao fazer conversões intx. Quando eu quero fazer a conversão float-int, poder escolher o tipo de arredondamento é um recurso interessante.
Bakuriu 11/09/12
11
Portanto, a maneira mais simples de converter quase ints com segurança 7.99999em ints como 8é np.rint(arr).astype(int)?
Endolith 12/10/12
de alguma forma numpy para torná-lo uint8?
Ryan
2
@Ryanastype(np.uint8)
Chris Anderson
14
você pode 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]])
Se a matriz de entrada já tiver o tipo correto, asarrayevite a cópia da matriz, enquanto astypenão possui (a menos que você 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
ou possuinp.nan
uma matriz, pois eles têm resultados surpreendentes. Por exemplo,np.array([np.inf]).astype(int)
saídasarray([-9223372036854775808])
.np.array([np.inf]).astype(int)
,np.array([-np.inf]).astype(int)
, enp.array([np.nan]).astype(int)
tudo voltar a mesma coisa. Por quê?nan
einf
são valores de ponto flutuante e não podem ser convertidos significativamente em int. Como observa o comentário antes do seu, haverá um comportamento surpreendente, e não acho que o comportamento preciso seja bem definido. Se você deseja mapearnan
einf
para determinados valores, você mesmo precisa fazer isso.int
. Énumpy.int32
.Algumas funções numpy para como controlar o arredondamento: rint , chão , trunc , ceil . dependendo de como você deseja arredondar os carros alegóricos, para cima, para baixo ou para o int mais próximo.
Para transformar um desses em int ou um dos outros tipos em numpy, astype (conforme respondido por BrenBern):
fonte
astype
geralmente é muito genérico e acho que provavelmente é mais útil ao fazer conversões intx. Quando eu quero fazer a conversão float-int, poder escolher o tipo de arredondamento é um recurso interessante.7.99999
em ints como8
énp.rint(arr).astype(int)
?astype(np.uint8)
você pode usar
np.int_
:fonte
Se você não tiver certeza de que sua entrada será uma matriz Numpy, use
asarray
com emdtype=int
vez deastype
:Se a matriz de entrada já tiver o tipo correto,
asarray
evite a cópia da matriz, enquantoastype
não possui (a menos que você especifiquecopy=False
):fonte