Lihat ke array numpy?

90

Saya memiliki numpyarray 2D . Apakah ada cara untuk membuat tampilan di atasnya yang akan menyertakan kbaris pertama dan semua kolom?

Intinya adalah untuk menghindari penyalinan data yang mendasarinya (lariknya sangat besar sehingga membuat salinan parsial tidak dapat dilakukan.)

NPE
sumber

Jawaban:

228

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 yakan diterapkan xdan 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 += 10akan memodifikasi array pada tempatnya, sementara x = x + 10akan membuat salinan dan memodifikasinya. (juga, lihat numexpr )

Jika Anda benar-benar ingin membuat salinan dengan x = x + 10, ketahuilah bahwa ini x = x + 10.0akan menyebabkan xsecara otomatis di-up-cast ke array floating point, jika belum. Namun, x += 10.0where xis an integer array, akan menyebabkan 10.0down-casted ke int dengan presisi yang sama seperti array.

Selain itu, banyak fungsi numpy yang mengambil outparameter, sehingga Anda dapat melakukan hal-hal seperti np.abs(x, x)mengambil nilai absolut xdi 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.0sebagai float 64bit pada sistem little-endian akan 4607182418800017408dipandang 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.

Joe Kington
sumber
Terima kasih atas tip yang sangat bagus! Saya sempat membaca buku petunjuk Numpy dan bingung kenapa x[np.array([1, 1, 3, 1])] += 1dimodifikasi x. Sekarang mengerti!
tnq177
tips bagus! Saya punya pertanyaan lain. Bagaimana cara membuktikan bahwa numpy tidak memicu salinan tetapi hanya tampilan? python's id () tampaknya tidak mampu melakukan ini.
wuhaochi
3
@wuhaochi Jika badalah pemandangan a, maka b.base is aakan True. Salinan (dari array apa pun) akan selalu memilikiarr_copy.base is None
Jürg Merlin Spaak