Nasıl 2D float numpy dizi 2D int numpy dizi dönüştürmek için?


302

Nasıl gerçek numpy dizi int numpy dizi dönüştürmek için? Haritayı doğrudan diziye kullanarak denedim ama işe yaramadı.

Yanıtlar:


404

astypeYöntemi kullanın .

>>> 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
Şaşırtıcı sonuçları olduğu için dizinizde np.infveya np.nandizinizde olmadığından emin olun . Örneğin, np.array([np.inf]).astype(int)çıktılar array([-9223372036854775808]).
Garrett

Benim makinede np.array([np.inf]).astype(int), np.array([-np.inf]).astype(int)ve np.array([np.nan]).astype(int)hepsi aynı şeyi dönün. Neden?
BallpointBen

1
@BallpointBen: nanve infkayan nokta değerleridir ve anlamlı olarak int değerine dönüştürülemez. Sizinkinden önceki yorumun belirttiği gibi, şaşırtıcı bir davranış olacaktır ve kesin davranışın iyi tanımlandığını düşünmüyorum. Eşlemek nanve infbelirli değerlerle eşleştirmek istiyorsanız , bunu kendiniz yapmanız gerekir.
BrenBarn

X.astype (int) [0] [0] türünün olmadığını unutmayın int. Öyle numpy.int32.
Chris Anderson

Bu, diziyi ints'e dönüştürse de, @ fhtuft'un daha az sürprizle sonuçlanabilecek cevabı
Nathan Musoke

66

: Yuvarlama nasıl kontrol için bazı numpy fonksiyonlar Rint , zemin , trunc , hücrelerinin, . nasıl yüzer, yukarı, aşağı veya en yakın int yuvarlamak istediğiniz bağlı.

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

Bunlardan birini int'e veya diğer türlerden birini numpy, astype yapmak için (BrenBern tarafından cevaplandığı gibi):

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

>>> y.astype(int)
array([[1, 2],
       [1, 2]])

2
Tam aradığım şey. astypegenellikle çok geneldir ve bence intx - inty dönüşümleri yaparken daha yararlı olur. Ben float - int dönüşüm yapmak istediğim zaman yuvarlama türünü seçebilmek güzel bir özellik.
Bakuriu

11
Güvenle gibi neredeyse int'leri dönüştürmek için basit yolu Yani 7.99999ints mi 8olduğunu np.rint(arr).astype(int)?
Endolit

uint8 yapmak için numpy herhangi bir şekilde?
Ryan

2
@Ryanastype(np.uint8)
Chris Anderson

14

şunları kullanabilirsiniz 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

Girişinizin bir Numpy dizisi olacağından emin değilseniz, aşağıdakiler yerine asarrayile kullanabilirsiniz :dtype=intastype

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

Girdi dizisi zaten doğru dtype'e sahip değilse asarray, dizinin kopyalanmasını önler astype(belirtmedikçe 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.