Misalkan saya punya:
test = numpy.array([[1, 2], [3, 4], [5, 6]])
test[i]
membuat saya baris ke-i array (misalnya [1, 2]
). Bagaimana saya bisa mengakses kolom ke - i ? (misalnya [1, 3, 5]
). Juga, apakah ini operasi yang mahal?
>>> test[:,0]
array([1, 3, 5])
Demikian pula,
>>> test[1,:]
array([3, 4])
memungkinkan Anda mengakses baris. Ini dicakup dalam Bagian 1.4 (Pengindeksan) dari referensi NumPy . Ini cepat, setidaknya dalam pengalaman saya. Ini tentu jauh lebih cepat daripada mengakses setiap elemen dalam satu lingkaran.
Dan jika Anda ingin mengakses lebih dari satu kolom sekaligus, Anda dapat melakukannya:
sumber
test[:,[0,2]]
hanya mengakses data, misalnya,test[:, [0,2]] = something
akan memodifikasi tes, dan tidak membuat array lain. Tetapicopy_test = test[:, [0,2]]
apakah sebenarnya membuat salinan seperti yang Anda katakan.test[:,[0,2]]
hanya mengakses data sementaratest[:, [0, 2]][:, [0, 1]]
tidak? Tampaknya sangat tidak intuitif bahwa melakukan hal yang sama lagi memiliki hasil yang berbeda.perintah ini memberi Anda vektor baris, jika Anda hanya ingin mengulanginya, tidak apa-apa, tetapi jika Anda ingin hstack dengan beberapa array lain dengan dimensi 3xN, Anda akan memiliki
sementara
memberi Anda vektor kolom, sehingga Anda dapat melakukan operasi gabungan atau hstack.
misalnya
sumber
Anda juga dapat mengubah posisi dan mengembalikan baris:
sumber
Untuk mendapatkan beberapa kolom independen, cukup:
Anda akan mendapatkan kolum 0 dan 2
sumber
Meskipun pertanyaan telah dijawab, izinkan saya menyebutkan beberapa nuansa.
Katakanlah Anda tertarik pada kolom pertama array
Seperti yang sudah Anda ketahui dari jawaban lain, untuk mendapatkannya dalam bentuk "vektor baris" (array bentuk
(3,)
), Anda menggunakan slicing:Untuk memeriksa apakah array adalah tampilan atau salinan array lain, Anda dapat melakukan hal berikut:
lihat ndarray.base .
Selain perbedaan yang jelas antara keduanya (modifikasi
arr_c1_ref
akan mempengaruhiarr
), jumlah byte-langkah untuk melintasi masing-masing berbeda:lihat langkah . Mengapa ini penting? Bayangkan Anda memiliki array yang sangat besar,
A
bukanarr
:dan Anda ingin menghitung jumlah semua elemen kolom pertama, yaitu
A_c1_ref.sum()
atauA_c1_copy.sum()
. Menggunakan versi yang disalin jauh lebih cepat:Ini karena perbedaan jumlah langkah yang disebutkan sebelumnya:
Meskipun mungkin terlihat bahwa menggunakan salinan kolom lebih baik, itu tidak selalu benar karena alasan membuat salinan memerlukan waktu dan menggunakan lebih banyak memori (dalam hal ini butuh sekitar 200 μs untuk membuat
A_c1_copy
). Namun jika kita memerlukan salinan di tempat pertama, atau kita perlu melakukan banyak operasi berbeda pada kolom spesifik dari array dan kita setuju dengan mengorbankan memori untuk kecepatan, maka membuat salinan adalah cara yang harus dilakukan.Jika kami tertarik bekerja sebagian besar dengan kolom, mungkin ide yang baik untuk membuat array kami dalam urutan kolom-utama ('F') alih-alih urutan baris-utama ('C') (yang merupakan default ), lalu lakukan pengiris seperti sebelumnya untuk mendapatkan kolom tanpa menyalinnya:
Sekarang, melakukan operasi penjumlahan (atau lainnya) pada tampilan kolom jauh lebih cepat.
Akhirnya saya perhatikan bahwa transposing array dan menggunakan slice baris sama dengan menggunakan slice kolom pada array asli, karena transposing dilakukan dengan hanya menukar bentuk dan langkah array asli.
sumber
Kemudian Anda dapat memilih kolom 2 - 4 dengan cara ini:
sumber