Gunakan val.item()
untuk mengonversi sebagian besar nilai NumPy ke tipe Python asli:
import numpy as np
# for example, numpy.float32 -> python float
val = np.float32(0)
pyval = val.item()
print(type(pyval)) # <class 'float'>
# and similar...
type(np.float64(0).item()) # <class 'float'>
type(np.uint32(0).item()) # <class 'long'>
type(np.int16(0).item()) # <class 'int'>
type(np.cfloat(0).item()) # <class 'complex'>
type(np.datetime64(0, 'D').item()) # <class 'datetime.date'>
type(np.datetime64('2001-01-01 00:00:00').item()) # <class 'datetime.datetime'>
type(np.timedelta64(0, 'D').item()) # <class 'datetime.timedelta'>
...
(Metode lain adalah np.asscalar(val)
, namun sudah ditinggalkan sejak NumPy 1.16).
Bagi yang penasaran, untuk membuat tabel konversi skalar array NumPy untuk sistem Anda:
for name in dir(np):
obj = getattr(np, name)
if hasattr(obj, 'dtype'):
try:
if 'time' in name:
npn = obj(0, 'D')
else:
npn = obj(0)
nat = npn.item()
print('{0} ({1!r}) -> {2}'.format(name, npn.dtype.char, type(nat)))
except:
pass
Ada beberapa jenis NumPy yang tidak memiliki setara Python asli pada beberapa sistem, termasuk: clongdouble
, clongfloat
, complex192
, complex256
, float128
, longcomplex
, longdouble
dan longfloat
. Ini perlu dikonversi ke setara NumPy terdekat sebelum menggunakan .item()
.
np.str
bukan tipe Numpy, yaitunp.str is str
, jadi itu hanya alias untuk tipe Python standar. Sama dengannp.float
,np.int
,np.bool
,np.complex
, dannp.object
. Tipe Numpy memiliki trailing_
, misnp.str_
.np.float64(0).item()
dan juganp.float(0).item()
. Dengan kata lain, untuk kasus-kasus di mana diketahui apa yang harus dilakukan, dukung.item()
metode tersebut meskipun hanya mengembalikan nilai yang sama. Dengan begitu saya bisa menerapkan.item()
pada skalar yang jauh lebih numpy tanpa casing khusus. Karena itu, konsep paralel tampaknya berbeda karena implementasi yang mendasarinya. Saya benar-benar mengerti mengapa ini dilakukan. Tapi itu menjengkelkan bagi pengguna perpustakaan.menemukan diri saya memiliki set campuran tipe numpy dan python standar. karena semua jenis numpy berasal dari
numpy.generic
, inilah cara Anda dapat mengubah segalanya menjadi tipe standar python:sumber
np.asscalar()
metode ini. Mengapa? Mungkin tanpa alasan yang jelas. Meskipun memiliki stabilitas relatif selama satu dekade, API NumPy sekarang menjadi target bergerak yang tidak stabil yang mengharuskan pemeliharaan konstan dari aplikasi hilir. Setidaknya mereka meninggalkan kitaitem()
metode ... untuk saat ini.if isinstance(o, numpy.generic): return o.item() raise TypeError
dan itu berubah menjadi jawaban yang tidak usang lagi: DJika Anda ingin mengonversi (numpy.array ATAU numpy skalar ATAU tipe asli ATAU numpy.darray) UNTUK tipe asli Anda cukup lakukan:
tolist akan mengonversi skalar atau array Anda menjadi tipe asli python. Fungsi lambda default menangani kasus di mana nilai sudah asli.
sumber
lambda: value
karena kita tidak menginginkan input apa pun.getattr
+tolist
kombo tidak hanya universal, tetapi bahkan vektor! (batalkan tautan .item ())Bagaimana tentang:
sumber
np.dtype('mint8')
untuk bilangan bulat positifm
. Tidak mungkin ada pemetaan yang lengkap. (Saya juga tidak percaya ada fungsi bawaan untuk melakukan konversi ini untuk Anda. Saya bisa saja salah, tapi saya rasa tidak :))>>> print([numpy.asscalar(x) for x in numpy.linspace(1.0, 0.0, 21)]) [1.0, 0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.6499999999999999, 0.6, 0.55, 0.5, 0.44999999999999996, 0.3999999999999999, 0.35, 0.29999999999999993, 0.25, 0.19999999999999996, 0.1499999999999999, 0.09999999999999998, 0.04999999999999993, 0.0]
Seperti yang Anda lihat tidak semua nilai dikonversi dengan benar.>>> print([numpy.asscalar(round(x,2)) for x in numpy.linspace(1.0, 0.0, 21)]) [1.0, 0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6, 0.55, 0.5, 0.45, 0.4, 0.35, 0.3, 0.25, 0.2, 0.15, 0.1, 0.05, 0.0]
tolist()
adalah pendekatan yang lebih umum untuk mencapai hal ini. Ia bekerja di semua tipe primitif dan juga dalam array atau matriks.Saya sebenarnya tidak menghasilkan daftar jika dipanggil dari tipe primitif:
numpy == 1.15.2
sumber
Anda juga dapat memanggil
item()
metode objek yang ingin Anda konversi:sumber
Saya pikir Anda bisa menulis fungsi convert tipe umum seperti:
Ini berarti tidak ada daftar tetap dan kode Anda akan diskalakan dengan lebih banyak jenis.
sumber
numpy.ndarray
1 nol di dalamnya menggunakanzeros()
dan memanggilndarrays
tolist()
fungsi untuk mengkonversi ke tipe asli. Setelah dalam jenis asli saya meminta jenis mengembalikannya.tolist()
adalah fucntion darindarray
grep -r 'tolist' numpy
. (masih dalam proses, numpy sangat besar!)numpy berpendapat bahwa informasi dalam pemetaan terbuka
typeDict
sehingga Anda dapat melakukan sesuatu seperti di bawah ini ::Jika Anda menginginkan tipe python yang sebenarnya daripada namanya, Anda dapat melakukan ::
sumber
Maaf terlambat datang ke sebagian, tapi saya melihat masalah konversi
numpy.float64
ke Python biasafloat
saja. Saya melihat 3 cara melakukan itu:npValue.item()
npValue.astype(float)
float(npValue)
Berikut ini adalah timing yang relevan dari IPython:
Kedengarannya seperti
float(npValue)
tampaknya jauh lebih cepat.sumber
Pendekatan saya agak kuat, tetapi tampaknya bermain bagus untuk semua kasus:
Pemakaian:
sumber
Catatan tambahan tentang skalar array untuk mereka yang tidak memerlukan konversi otomatis dan mengetahui jenis numpy nilainya:
Sumber
Jadi, untuk sebagian besar kasus konversi mungkin tidak diperlukan sama sekali, dan skalar array dapat digunakan secara langsung. Efeknya harus identik dengan menggunakan skalar Python:
Tetapi jika, karena alasan tertentu, konversi eksplisit diperlukan, menggunakan fungsi bawaan Python yang sesuai adalah cara yang harus dilakukan. Seperti yang ditunjukkan pada jawaban lain, ini juga lebih cepat daripada
item()
metode skalar array .sumber
Menerjemahkan seluruh ndarray sebagai satu objek data unit:
Namun, dibutuhkan beberapa menit saat menangani kerangka data yang besar. Saya juga mencari solusi yang lebih efisien. Semoga jawaban yang lebih baik.
sumber