Saya perlu membuat array NumPy dengan panjang n
, yang masing-masing elemen v
.
Adakah yang lebih baik dari:
a = empty(n)
for i in range(n):
a[i] = v
Saya tahu zeros
dan ones
akan bekerja untuk v = 0, 1. Aku bisa menggunakan v * ones(n)
, tetapi tidak akan bekerja ketika akan jauh lebih lambat.v
adalahNone
, dan juga
a = np.zeros(n)
dalam lingkaran lebih cepat daripadaa.fill(0)
. Ini bertentangan dengan apa yang saya harapkan karena saya pikira=np.zeros(n)
perlu mengalokasikan dan menginisialisasi memori baru. Jika ada yang bisa menjelaskan ini, saya akan sangat menghargainya.v * ones(n)
masih mengerikan, karena menggunakan perkalian yang mahal. Ganti*
dengan+
meskipun, danv + zeros(n)
ternyata sangat bagus dalam beberapa kasus ( stackoverflow.com/questions/5891410/… ).var = np.empty(n)
dan kemudian mengisinya dengan 'var [:] = v'. (Btw,np.full()
secepat ini)Jawaban:
NumPy 1.8 diperkenalkan
np.full()
, yang merupakan metode yang lebih langsung daripadaempty()
diikuti olehfill()
untuk membuat array diisi dengan nilai tertentu:Ini bisa dibilang yang cara untuk menciptakan sebuah array diisi dengan nilai-nilai tertentu, karena secara eksplisit menggambarkan apa yang sedang dicapai (dan dapat pada prinsipnya menjadi sangat efisien karena melakukan tugas yang sangat spesifik).
sumber
help(numpy.full)
di shell Python. Saya juga terkejut bahwa itu tidak ada dalam dokumentasi web.np.fill()
tidak ada dan seharusnyaarr.fill()
), dengan perbedaan sekitar 10%. Jika perbedaannya lebih besar, saya akan mengangkat masalah dalam pelacak bug NumPy. :) Saya lebih suka kode yang lebih eksplisit dan lebih jelas, untuk perbedaan kecil dalam mengeksekusi waktu, jadi sayanp.full()
selalu mengikuti.Diperbarui untuk Numpy 1.7.0: (Hat-tip ke @Rolf Bartstra.)
a=np.empty(n); a.fill(5)
tercepat.Dalam urutan kecepatan menurun:
sumber
np.full()
akan bermanfaat. Di komputer saya, dengan NumPy 1.8.1, ini sekitar 15% lebih lambat dari versi yang kurang langsungfill()
(yang tidak terduga, karenafull()
berpotensi sedikit lebih cepat).fill()
adalah solusi tercepat. Solusi multiplikasi jauh lebih lambat.10000
alih-alih1e4
membuat perbedaan yang nyata, untuk beberapa alasan (full()
hampir 50% lebih lambat, dengan1e4
).full()
, itu berjalan jauh lebih lambat ketika datatype tidak secara eksplisit float. Kalau tidak, ini sebanding (tapi sedikit lebih lambat) dengan metode terbaik di sini.full(100000, 5)
,full(100000, 5, dtype=float)
,full(100000, 5, dtype=int)
dana =np.empty(100000); a.fill(5)
semua mengambil sekitar waktu yang sama pada mesin (tanpa caching:%timeit -r1 -n1 …
) (NumPy 1.11.2).Saya percaya
fill
adalah cara tercepat untuk melakukan ini.Anda juga harus selalu menghindari iterasi seperti yang Anda lakukan dalam contoh Anda. Sederhana
a[:] = v
akan mencapai apa yang dilakukan iterasi Anda menggunakan siaran numpy .sumber
fill
, saya melihat yang lebihrepeat
sesuai dengan kebutuhan saya.a[:]=v
sebenarnya secara keseluruhan lebih cepat daripadafill
?fill
.Tampaknya, tidak hanya kecepatan absolut tetapi juga urutan kecepatan (seperti yang dilaporkan oleh user1579844) bergantung pada mesin; inilah yang saya temukan:
a=np.empty(1e4); a.fill(5)
tercepat;Dalam urutan kecepatan menurun:
Jadi, coba dan cari tahu, dan gunakan apa yang tercepat di platform Anda.
sumber
Saya punya
dalam pikiran, tetapi ternyata itu lebih lambat dari semua saran lain untuk cukup besar
n
.Berikut ini perbandingan lengkap dengan perfplot (proyek kesayangan saya).
Dua
empty
alternatif tersebut masih yang tercepat (dengan NumPy 1.12.1).full
mengejar array yang besar.Kode untuk menghasilkan plot:
sumber
Anda dapat menggunakan
numpy.tile
, misalnya:Meskipun
tile
dimaksudkan untuk 'memasang' array (alih-alih skalar, seperti dalam kasus ini), itu akan melakukan tugasnya, membuat array yang sudah diisi sebelumnya dari berbagai ukuran dan dimensi.sumber
tanpa numpy
sumber
[v] * n
akan lebih langsung relevan dengan pertanyaan OP.