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):
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]])
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
np.inf
ataunp.nan
dalam susunan Anda, karena hasilnya mengejutkan. Misalnya,np.array([np.inf]).astype(int)
keluaranarray([-9223372036854775808])
.np.array([np.inf]).astype(int)
,np.array([-np.inf]).astype(int)
, dannp.array([np.nan]).astype(int)
semua kembali hal yang sama. Mengapa?nan
daninf
merupakan 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 memetakannan
daninf
nilai-nilai tertentu, Anda perlu melakukannya sendiri.int
. Ininumpy.int32
.Beberapa fungsi numpy untuk bagaimana mengontrol pembulatan: etak , lantai , trunc , ceil . tergantung bagaimana Anda ingin mengitari pelampung, atas, bawah, atau ke int terdekat.
Untuk membuat salah satu dari ini ke int, atau salah satu dari tipe lain di numpy, astype (seperti dijawab oleh BrenBern):
sumber
astype
sering 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.7.99999
ke int8
, sepertinp.rint(arr).astype(int)
?astype(np.uint8)
Anda bisa menggunakan
np.int_
:sumber
Jika Anda tidak yakin masukan Anda akan menjadi array Numpy, Anda dapat menggunakan
asarray
dengandtype=int
bukannyaastype
:Jika array input sudah memiliki dtype yang benar,
asarray
hindari salinan array sementaraastype
tidak (kecuali Anda tentukancopy=False
):sumber