Saya memiliki kode berikut:
r = numpy.zeros(shape = (width, height, 9))
Itu menciptakan width x height x 9
matriks diisi dengan nol. Sebagai gantinya, saya ingin tahu apakah ada fungsi atau cara untuk menginisialisasi mereka alih-alih dengan NaN
cara mudah.
np.nan
salah ketika dikonversi ke int.Jawaban:
Anda jarang membutuhkan loop untuk operasi vektor di numpy. Anda dapat membuat larik yang belum diinisialisasi dan menetapkan semua entri sekaligus:
Saya telah menghitung waktunya alternatif di
a[:] = numpy.nan
sini dana.fill(numpy.nan)
sebagaimana diposting oleh Blaenk:Pengaturan waktu menunjukkan preferensi untuk
ndarray.fill(..)
sebagai alternatif yang lebih cepat. OTOH, saya suka implementasi kenyamanan numpy di mana Anda dapat menetapkan nilai untuk seluruh irisan pada saat itu, maksud kode sangat jelas.Perhatikan bahwa
ndarray.fill
menjalankan operasinya di tempat, jadinumpy.empty((3,3,)).fill(numpy.nan)
alih-alih akan kembaliNone
.sumber
a = numpy.empty((3, 3,)) * numpy.nan
. Waktunya lebih cepat dari padafill
tetapi lebih lambat dari pada metode penugasan, tetapi itu adalah oneliner !!.fill()
metode ini, tetapi perbedaan kecepatan berkurang menjadi hampir tidak ada saat array semakin besar.np.empty([2, 5])
membuat array, kemudianfill()
memodifikasi array itu di tempat, tetapi tidak mengembalikan salinan atau referensi. Jika Anda ingin memanggilnp.empty(2, 5)
dengan nama ("assign is to a variable"), Anda harus melakukannya sebelum melakukan operasi di tempat. Hal yang sama juga terjadi jika Anda melakukannya[1, 2, 3].insert(1, 4)
. Daftar dibuat dan 4 dimasukkan, tetapi tidak mungkin untuk mendapatkan referensi ke daftar (dan dengan demikian dapat diasumsikan telah dikumpulkan dari sampah). Pada data yang tidak dapat diubah seperti string, salinan dikembalikan, karena Anda tidak dapat beroperasi di tempat. Panda dapat melakukan keduanya.Opsi lain adalah menggunakan
numpy.full
, opsi yang tersedia di NumPy 1.8+Ini cukup fleksibel dan Anda dapat mengisinya dengan nomor lain yang Anda inginkan.
sumber
full
.np.empy((x,y))*np.nan
adalah runner-up yang bagus (dan kompatibilitas untuk versi lama numpy).fill
python -mtimeit "import numpy as np; a = np.empty((100,100));" "a.fill(np.nan)" 100000 loops, best of 3: 13.3 usec per loop python -mtimeit "import numpy as np; a = np.full((100,100), np.nan);" 100000 loops, best of 3: 18.5 usec per loop
python -mtimeit "import numpy as np; a = np.empty((1000,1000)); a.fill(np.nan)" 1000 loops, best of 3: 381 usec per loop $ python -mtimeit "import numpy as np; a = np.full((1000,1000), np.nan);" 1000 loops, best of 3: 383 usec per loop
Saya membandingkan alternatif kecepatan yang disarankan dan menemukan bahwa, untuk mengisi vektor / matriks yang cukup besar, semua alternatif kecuali
val * ones
danarray(n * [val])
sama-sama cepat.Kode untuk mereproduksi plot:
sumber
numpy.full(n, val)
lebih lambat daripadaa = numpy.empty(n) .. a.fill(val)
karena ia melakukan hal yang sama secara internalApakah Anda kenal
numpy.nan
?Anda dapat membuat metode Anda sendiri seperti:
Kemudian
akan menghasilkan
Saya menemukan kode ini di utas milis .
sumber
Anda selalu dapat menggunakan perkalian jika Anda tidak segera mengingat metode
.empty
atau.full
:Tentu saja ia bekerja dengan nilai numerik lainnya juga:
Tetapi jawaban yang diterima @ u0b34a0f6ae adalah 3x lebih cepat (siklus CPU, bukan siklus otak untuk mengingat sintaks numpy;):
sumber
Alternatif lain adalah
numpy.broadcast_to(val,n)
yang mengembalikan dalam waktu konstan terlepas dari ukuran dan juga yang paling efisien memori (mengembalikan tampilan elemen yang diulang). Peringatannya adalah bahwa nilai yang dikembalikan hanya baca-saja.Di bawah ini adalah perbandingan kinerja semua metode lain yang telah diusulkan menggunakan tolok ukur yang sama seperti dalam jawaban Nico Schlömer .
sumber
Seperti yang dikatakan, numpy.empty () adalah cara untuk pergi. Namun, untuk objek, fill () mungkin tidak melakukan persis seperti yang Anda pikirkan:
Salah satu jalan keluar misalnya:
sumber
Namun kemungkinan lain yang belum disebutkan di sini adalah menggunakan ubin NumPy:
Juga memberi
Saya tidak tahu tentang perbandingan kecepatan.
sumber