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é.

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

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.