Tentu, cukup indeks seperti biasa. Misalnya, y = x[:k, :]
ini akan mengembalikan tampilan ke array asli. Tidak ada data yang akan disalin, dan pembaruan apa pun yang dibuat y
akan diterapkan x
dan sebaliknya.
Edit:
Saya biasanya bekerja dengan array 3D> 10GB dari uint8, jadi saya sangat mengkhawatirkan hal ini ... Numpy bisa sangat efisien dalam manajemen memori jika Anda mengingat beberapa hal. Berikut adalah beberapa tip untuk menghindari membuat salinan array dalam memori:
Gunakan +=
, -=
, *=
, dll untuk menghindari membuat salinan dari array. Misalnya x += 10
akan memodifikasi array pada tempatnya, sementara x = x + 10
akan membuat salinan dan memodifikasinya. (juga, lihat numexpr )
Jika Anda benar-benar ingin membuat salinan dengan x = x + 10
, ketahuilah bahwa ini x = x + 10.0
akan menyebabkan x
secara otomatis di-up-cast ke array floating point, jika belum. Namun, x += 10.0
where x
is an integer array, akan menyebabkan 10.0
down-casted ke int dengan presisi yang sama seperti array.
Selain itu, banyak fungsi numpy yang mengambil out
parameter, sehingga Anda dapat melakukan hal-hal seperti np.abs(x, x)
mengambil nilai absolut x
di tempat.
Sebagai pengeditan kedua, berikut beberapa tip lagi tentang views vs. copy dengan numpy array:
Tidak seperti daftar python, y = x[:]
tidak mengembalikan salinan, ini mengembalikan tampilan. Jika Anda memang menginginkan salinan (yang tentu saja akan menggandakan jumlah memori yang Anda gunakan) gunakany = x.copy()
Anda akan sering mendengar tentang "pengindeksan mewah" dari array numpy. Menggunakan daftar (atau array integer) sebagai indeks adalah "pengindeksan mewah". Ini bisa sangat berguna, tetapi menyalin data.
Sebagai contoh dari ini: y = x[[0, 1, 2], :]
mengembalikan salinan, sementara y = x[:3,:]
akan mengembalikan tampilan.
Bahkan pengindeksan yang benar-benar gila seperti pengindeksan x[4:100:5, :-10:-1, None]
"normal" dan akan mengembalikan tampilan, jadi jangan takut untuk menggunakan semua jenis trik pemotongan pada array besar.
x.astype(<dtype>)
akan mengembalikan salinan data sebagai tipe baru, sementara x.view(<dtype>)
akan mengembalikan tampilan.
Hati-hati dengan ini, bagaimanapun ... Ini sangat kuat dan berguna, tetapi Anda perlu memahami bagaimana data yang mendasarinya disimpan dalam memori. Jika Anda memiliki array float, dan melihatnya sebagai int, (atau sebaliknya) numpy akan menafsirkan bit yang mendasari array sebagai int.
Misalnya, ini berarti bahwa 1.0
sebagai float 64bit pada sistem little-endian akan 4607182418800017408
dipandang sebagai int 64bit, dan array [ 0, 0, 0, 0, 0, 0, 240, 63]
if dipandang sebagai uint8. Ini benar-benar bagus ketika Anda perlu melakukan bit-twiddling atau semacamnya pada array besar, meskipun ... Anda memiliki kontrol tingkat rendah atas bagaimana buffer memori diinterpretasikan.
x[np.array([1, 1, 3, 1])] += 1
dimodifikasix
. Sekarang mengerti!