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é.
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):
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]])
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
np.inf
ounp.nan
dans votre tableau, car ils ont des résultats surprenants. Par exemple, lesnp.array([np.inf]).astype(int)
sortiesarray([-9223372036854775808])
.np.array([np.inf]).astype(int)
,np.array([-np.inf]).astype(int)
etnp.array([np.nan]).astype(int)
retourner la même chose. Pourquoi?nan
etinf
sont 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 mappernan
etinf
à certaines valeurs, vous devez le faire vous-même.int
. Ça l'estnumpy.int32
.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.
Pour faire un de ceci dans int, ou l'un des autres types dans numpy, astype (comme répondu par BrenBern):
la source
astype
est 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.7.99999
des pouces comme8
, estnp.rint(arr).astype(int)
?astype(np.uint8)
vous pouvez utiliser
np.int_
:la source
Si vous n'êtes pas sûr que votre entrée sera un tableau Numpy, vous pouvez utiliser
asarray
avecdtype=int
au lieu deastype
:Si le tableau d'entrée a déjà le bon type,
asarray
évite la copie du tableau alors que ceastype
n'est pas le cas (sauf si vous le spécifiezcopy=False
):la source