Diberikan array NumPy int32
, bagaimana cara mengubahnya float32
di tempat ? Jadi pada dasarnya, saya ingin melakukannya
a = a.astype(numpy.float32)
tanpa menyalin array. Itu besar.
Alasan untuk melakukan ini adalah bahwa saya memiliki dua algoritma untuk perhitungan a
. Salah satunya mengembalikan array int32
, yang lain mengembalikan array float32
(dan ini melekat pada dua algoritma yang berbeda). Semua perhitungan lebih lanjut menganggap itu a
adalah array dari float32
.
Saat ini saya melakukan konversi dalam fungsi C yang dipanggil via ctypes
. Apakah ada cara untuk melakukan ini dengan Python?
ctypes
sebanyak "dengan Python" seperti menggunakannumpy
. :)Jawaban:
Anda dapat membuat tampilan dengan tipe yang berbeda, dan kemudian menyalin di tempat ke tampilan:
hasil panen
Untuk menunjukkan bahwa konversi sudah dilakukan, perhatikan bahwa penyalinan dari
x
key
diubahx
:cetakan
sumber
np.arange(10, dtype=np.int32).view(np.float32)
pada Numpy 1.8.2, saya mengertiarray([ 0.00000000e+00, 1.40129846e-45, ... [snip] ... 1.26116862e-44], dtype=float32)
.y[:] = x
.a = np.arange(10, dtype='float32'); b = a[::-1]; c = np.vstack((a,b)); d = c.view('float64')
Kode ini membutuhkan 10 + 10 float32 dan menghasilkan 10, bukan 20 float64x.astype(float)
konversi sederhana . Saya tidak akan merekomendasikan hal ini kecuali skrip Anda berbatasan dengan MemoryError.Pembaruan: Fungsi ini hanya menghindari salinan jika bisa, maka ini bukan jawaban yang benar untuk pertanyaan ini. jawaban unutbu adalah yang benar.
astype numpy memiliki bendera salinan. Kenapa kita tidak menggunakannya?
sumber
Anda dapat mengubah jenis array tanpa mengonversi seperti ini:
tetapi pertama-tama Anda harus mengubah semua bilangan bulat menjadi sesuatu yang akan ditafsirkan sebagai float yang sesuai. Cara yang sangat lambat untuk melakukan ini adalah dengan menggunakan
struct
modul python seperti ini:... diterapkan pada setiap anggota array Anda.
Tapi mungkin cara yang lebih cepat adalah dengan menggunakan alat ctypeslib numpy (yang saya tidak kenal)
- edit -
Karena ctypeslib tampaknya tidak berfungsi, maka saya akan melanjutkan konversi dengan
numpy.astype
metode biasa , tetapi melanjutkan dalam ukuran blok yang berada dalam batas memori Anda:... lalu ubah dtype setelah selesai.
Berikut adalah fungsi yang menyelesaikan tugas untuk setiap dtypes yang kompatibel (hanya berfungsi untuk dtypes dengan item berukuran sama) dan menangani array berbentuk sewenang-wenang dengan kontrol pengguna atas ukuran blok:
sumber
a.view(numpy.float32)
. Bagian yang sulit sebenarnya adalah mengubah data.numpy.ctypeslib
hanya membantu menafsirkan ulang data, bukan dengan benar-benar mengubahnya.gunakan view () dan parameter 'dtype' untuk mengubah larik di tempat.
sumber
int
, jawaban ini hanya akan menafsirkan kembali data yang ada sebagai jenis yang berbeda, yang bukan yang saya minta.dtype
,order
dansubok
persyaratan untuk kembali salinan dari array? Saya tidak menyelesaikannya.Gunakan ini:
sumber
a = np.subtract(a, 0., dtype=np.float32)
sumber
numpy.subtract
mengembalikan salinan, bukan? Hanya nama yanga
digunakan kembali untuk sepotong data ... Tolong jelaskan, jika saya salah tentang hal ini.