Bagaimana cara mengubah 2D float numpy array ke 2D int numpy array?

303

Bagaimana cara mengubah array numpy nyata menjadi array numpy? Sudah mencoba menggunakan peta langsung ke array tetapi tidak berhasil.

Shan
sumber

Jawaban:

405

Gunakan astypemetodenya.

>>> 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
sumber
30
Pastikan Anda tidak memiliki np.infatau np.nandalam susunan Anda, karena hasilnya mengejutkan. Misalnya, np.array([np.inf]).astype(int)keluaran array([-9223372036854775808]).
Garrett
Pada komputer saya, np.array([np.inf]).astype(int), np.array([-np.inf]).astype(int), dan np.array([np.nan]).astype(int)semua kembali hal yang sama. Mengapa?
BallpointBen
1
@BallpointBen: nandan infmerupakan nilai floating-point dan tidak dapat dikonversi secara berarti ke int. Seperti komentar sebelum catatan Anda, akan ada perilaku yang mengejutkan, dan saya tidak berpikir perilaku yang tepat didefinisikan dengan baik. Jika Anda ingin memetakan nandan infnilai-nilai tertentu, Anda perlu melakukannya sendiri.
BrenBarn
Perhatikan bahwa x.astype (int) [0] [0] bukan tipe int. Ini numpy.int32.
Chris Anderson
Perhatikan bahwa meskipun ini mengubah array menjadi ints, jawaban @ fhtuft yang dapat menghasilkan lebih sedikit kejutan
Nathan Musoke
66

Beberapa fungsi numpy untuk bagaimana mengontrol pembulatan: etak , lantai , trunc , ceil . tergantung bagaimana Anda ingin mengitari pelampung, atas, bawah, atau ke int terdekat.

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

Untuk membuat salah satu dari ini ke int, atau salah satu dari tipe lain di numpy, astype (seperti dijawab oleh BrenBern):

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

>>> y.astype(int)
array([[1, 2],
       [1, 2]])
fhtuft
sumber
2
Persis apa yang saya cari. astypesering terlalu umum, dan saya pikir itu mungkin lebih bermanfaat ketika melakukan konversi intx - inty. Ketika saya ingin melakukan konversi float - int dapat memilih jenis pembulatan adalah fitur yang bagus.
Bakuriu
11
Jadi, cara paling sederhana untuk secara aman mengkonversi hampir-int seperti 7.99999ke int 8, seperti np.rint(arr).astype(int)?
endolith
cara numpy untuk membuatnya uint8?
Ryan
2
@Ryanastype(np.uint8)
Chris Anderson
15

Anda bisa menggunakan 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
sumber
12

Jika Anda tidak yakin masukan Anda akan menjadi array Numpy, Anda dapat menggunakan asarraydengan dtype=intbukannya astype:

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

Jika array input sudah memiliki dtype yang benar, asarrayhindari salinan array sementara astypetidak (kecuali Anda tentukan 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 ''
sumber