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.

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

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.