Comment convertir un tableau numpy 2D flottant en tableau numpy 2D int?

303

Comment convertir un tableau numpy réel en tableau numpy int? J'ai essayé d'utiliser la carte directement dans le tableau, mais cela n'a pas fonctionné.

Shan
la source

Réponses:

405

Utilisez la astypeméthode.

>>> 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
la source
30
Assurez-vous simplement que vous n'en avez pas np.infou np.nandans votre tableau, car ils ont des résultats surprenants. Par exemple, les np.array([np.inf]).astype(int)sorties array([-9223372036854775808]).
Garrett
Sur ma machine, np.array([np.inf]).astype(int), np.array([-np.inf]).astype(int)et np.array([np.nan]).astype(int)retourner la même chose. Pourquoi?
BallpointBen
1
@BallpointBen: nanet infsont des valeurs à virgule flottante et ne peuvent pas être converties de manière significative en int. Comme le remarque le vôtre, il y aura un comportement surprenant, et je ne pense pas que le comportement précis soit bien défini. Si vous souhaitez mapper nanet infà certaines valeurs, vous devez le faire vous-même.
BrenBarn
Notez que x.astype (int) [0] [0] n'est pas de type int. Ça l'est numpy.int32.
Chris Anderson
Notez que bien que cela convertisse le tableau en pouces, la réponse de @ fhtuft peut entraîner moins de surprises
Nathan Musoke
66

Quelques fonctions numpy pour contrôler l'arrondi: rint , floor , trunc , ceil . selon la façon dont vous souhaitez arrondir les flotteurs, en haut, en bas ou à l'int. le plus proche.

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

Pour faire un de ceci dans int, ou l'un des autres types dans numpy, astype (comme répondu par BrenBern):

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

>>> y.astype(int)
array([[1, 2],
       [1, 2]])
fhtuft
la source
2
Exactement ce que je cherchais. astypeest souvent trop générique, et je pense qu'il est probablement plus utile lors des conversions intx - inty. Quand je veux faire une conversion float-int, pouvoir choisir le type d'arrondi est une fonctionnalité intéressante.
Bakuriu
11
Donc, le moyen le plus simple de convertir en toute sécurité des quasi-pouces comme 7.99999des pouces comme 8, est np.rint(arr).astype(int)?
endolith
en quelque sorte numpy pour le rendre uint8?
Ryan
2
@Ryanastype(np.uint8)
Chris Anderson
15

vous pouvez utiliser 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
la source
12

Si vous n'êtes pas sûr que votre entrée sera un tableau Numpy, vous pouvez utiliser asarrayavec dtype=intau lieu de astype:

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

Si le tableau d'entrée a déjà le bon type, asarrayévite la copie du tableau alors que ce astypen'est pas le cas (sauf si vous le spécifiez 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''
la source