Como converter um array numpy 2D float em um array numpy 2D int?

302

Como converter array numpy real para array numpy int? Tentei usar o mapa diretamente para a matriz, mas não funcionou.

Shan
fonte

Respostas:

405

Use o 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
fonte
30
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):

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

>>> y.astype(int)
array([[1, 2],
       [1, 2]])
fhtuft
fonte
2
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]])
Hackaholic
fonte
12

Se você não tiver certeza de que sua entrada será uma matriz Numpy, use asarraycom em dtype=intvez de astype:

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

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
1 ''
fonte