Situasi yang sering terjadi dalam pembelajaran mesin adalah memiliki data dalam jumlah besar; . Misalnya, bayangkan sebuah matriks dengan kolom adalah setiap film di Netflix, baris adalah setiap pengguna Netflix, dan nilainya adalah berapa kali pengguna menonton film tersebut. Matriks ini akan memiliki puluhan ribu kolom dan jutaan baris. Namun, karena sebagian besar pengguna tidak menonton sebagian besar film, sebagian besar elemen akan menjadi nol Show
Matriks jarang hanya menyimpan elemen bukan nol dan menganggap semua nilai lainnya akan menjadi nol, yang mengarah ke penghematan komputasi yang signifikan. Dalam solusi kami, kami membuat array NumPy dengan dua nilai bukan nol, lalu mengubahnya menjadi matriks jarang. Jika kita melihat matriks jarang kita dapat melihat bahwa hanya nilai bukan nol yang disimpan
(1, 1) 1 (2, 0) 3 Ada beberapa jenis matriks jarang. Namun, dalam matriks baris jarang terkompresi (CSR), (1, 1) 1 (2, 0) 30, masing-masing. Misalnya, elemen 1 ada di baris kedua dan kolom kedua. Kita dapat melihat keuntungan dari matriks jarang jika kita membuat matriks yang jauh lebih besar dengan lebih banyak elemen nol dan kemudian membandingkan matriks yang lebih besar ini dengan matriks jarang asli kita.
(1, 1) 1 (2, 0) 3
(1, 1) 1 (2, 0) 3 Seperti yang bisa kita lihat, terlepas dari kenyataan bahwa kita menambahkan lebih banyak elemen nol dalam matriks yang lebih besar, representasi renggangnya persis sama dengan matriks renggang asli kita. Artinya, penambahan elemen nol tidak mengubah ukuran matriks jarang Seperti disebutkan, ada banyak jenis matriks renggang, seperti kolom renggang terkompresi, daftar daftar, dan kamus kunci. Sementara penjelasan tentang berbagai jenis dan implikasinya berada di luar cakupan buku ini, perlu dicatat bahwa meskipun tidak ada jenis matriks jarang yang âterbaikâ, ada perbedaan yang berarti di antara mereka dan kita harus sadar tentang alasannya dapat diindeks menggunakan sintaks Python >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])6 standar, di mana x adalah larik dan objek pilihan. Ada berbagai jenis pengindeksan yang tersedia tergantung pada objek. pengindeksan dasar, pengindeksan lanjutan, dan akses bidang Sebagian besar contoh berikut menunjukkan penggunaan pengindeksan saat mereferensikan data dalam larik. Contoh berfungsi dengan baik saat menugaskan ke array. Lihat contoh dan penjelasan khusus tentang cara kerja tugas Perhatikan bahwa dalam Python, >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])_7 setara dengan >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])8; Pengindeksan dasarPengindeksan elemen tunggalPengindeksan elemen tunggal berfungsi persis seperti itu untuk urutan Python standar lainnya. Ini berbasis 0, dan menerima indeks negatif untuk pengindeksan dari akhir array >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 8 Tidak perlu memisahkan setiap indeks dimensi ke dalam kumpulan tanda kurung sikunya sendiri >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9 Perhatikan bahwa jika seseorang mengindeks array multidimensi dengan indeks lebih sedikit daripada dimensi, maka akan diperoleh array subdimensi. Sebagai contoh >>> x[0] array([0, 1, 2, 3, 4]) Artinya, setiap indeks yang ditentukan memilih larik yang sesuai dengan sisa dimensi yang dipilih. Dalam contoh di atas, memilih 0 berarti bahwa sisa dimensi dengan panjang 5 dibiarkan tidak ditentukan, dan yang dikembalikan adalah larik dengan dimensi dan ukuran tersebut. Harus dicatat bahwa array yang dikembalikan adalah a , i. e. , ini bukan salinan dari yang asli, tetapi menunjuk ke nilai yang sama di memori seperti halnya larik asli. Dalam hal ini, larik 1-D pada posisi pertama (0) dikembalikan. Jadi menggunakan satu indeks pada array yang dikembalikan, menghasilkan satu elemen yang dikembalikan. Itu adalah >>> x[0][2] 2 Jadi perhatikan bahwa >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])_9 meskipun kasus kedua lebih tidak efisien karena array sementara baru dibuat setelah indeks pertama yang kemudian diindeks oleh 2 Catatan NumPy menggunakan pengindeksan C-order. Itu berarti indeks terakhir biasanya mewakili lokasi memori yang paling cepat berubah, tidak seperti Fortran atau IDL, di mana indeks pertama mewakili lokasi yang paling cepat berubah dalam memori. Perbedaan ini merupakan potensi besar untuk kebingungan Mengiris dan melangkahPemotongan dasar memperluas konsep dasar pemotongan Python ke dimensi N. Pemotongan dasar terjadi ketika obj adalah objek (dibangun oleh >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])1 notasi di dalam tanda kurung), bilangan bulat, atau tupel objek irisan dan bilangan bulat. dan objek dapat diselingi dengan ini juga Kasus pengindeksan paling sederhana dengan bilangan bulat N mengembalikan an yang mewakili item terkait. Seperti di Python, semua indeks berbasis nol. untuk indeks ke-i \(n_i\) , rentang yang valid adalah \(0 \le n_i < . Indeks negatif ditafsirkan sebagai menghitung dari akhir array (mis. e. , jika where \(d_i\) is the i-th element of the shape of the array. Negative indices are interpreted as counting from the end of the array (i.e., if \(n_i < 0\) , artinya \(n_i + d_i\)). Semua larik yang dihasilkan oleh pemotongan dasar selalu dari larik asli Catatan Pemotongan NumPy membuat alih-alih salinan seperti dalam kasus urutan Python bawaan seperti string, tuple, dan daftar. Kehati-hatian harus diambil ketika mengekstraksi sebagian kecil dari array besar yang menjadi tidak berguna setelah ekstraksi, karena sebagian kecil yang diekstraksi berisi referensi ke array asli yang besar yang memorinya tidak akan dirilis sampai semua array yang berasal darinya dikumpulkan dari sampah. Dalam kasus seperti itu, >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])4 eksplisit direkomendasikan Aturan standar pemotongan urutan berlaku untuk pemotongan dasar berdasarkan per dimensi (termasuk menggunakan indeks langkah). Beberapa konsep yang berguna untuk diingat termasuk
Alat pengindeksan dimensiAda beberapa alat untuk memudahkan pencocokan bentuk array dengan ekspresi dan tugas memperluas ke jumlah >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])_7 objek yang diperlukan untuk pemilihan tupel untuk mengindeks semua dimensi. Dalam kebanyakan kasus, ini berarti bahwa panjang dari tuple pilihan yang diperluas adalah >>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]]) >>> x.shape (2, 3, 1) >>> x[1:2] array([[[4], [5], [6]]])8. Mungkin hanya ada satu elipsis yang ada. Dari contoh di atas >>> x[..., 0] array([[1, 2, 3], [4, 5, 6]]) Ini setara dengan >>> x[:, :, 0] array([[1, 2, 3], [4, 5, 6]]) Setiap objek dalam tupel seleksi berfungsi untuk memperluas dimensi dari seleksi yang dihasilkan oleh satu dimensi panjang-satuan. Dimensi yang ditambahkan adalah posisi objek dalam tupel pemilihan. adalah alias untuk >>> x[..., 0] array([[1, 2, 3], [4, 5, 6]])_2, dan >>> x[..., 0] array([[1, 2, 3], [4, 5, 6]])2 dapat digunakan sebagai pengganti this dengan hasil yang sama. Dari contoh di atas >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 90 Ini berguna untuk menggabungkan dua larik dengan cara yang sebaliknya akan memerlukan operasi pembentukan ulang secara eksplisit. Sebagai contoh >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 91 Pengindeksan tingkat lanjutPengindeksan lanjutan dipicu ketika objek pemilihan, obj, adalah objek urutan non-tuple, sebuah (dari tipe data integer atau bool), atau tuple dengan setidaknya satu objek urutan atau ndarray (dari tipe data integer atau bool). Ada dua jenis pengindeksan lanjutan. bilangan bulat dan Boolean Pengindeksan lanjutan selalu mengembalikan salinan data (berbeda dengan pemotongan dasar yang mengembalikan a ) Peringatan Definisi pengindeksan lanjutan berarti bahwa >>> x[..., 0] array([[1, 2, 3], [4, 5, 6]])_5 secara fundamental berbeda dari >>> x[..., 0] array([[1, 2, 3], [4, 5, 6]])6. Yang terakhir setara dengan >>> x[..., 0] array([[1, 2, 3], [4, 5, 6]])_7 yang akan memicu pemilihan dasar sedangkan yang pertama akan memicu pengindeksan lanjutan. Pastikan untuk memahami mengapa ini terjadi Pengindeksan array bilangan bulatPengindeksan array bilangan bulat memungkinkan pemilihan item arbitrer dalam array berdasarkan indeks N-dimensi mereka. Setiap array bilangan bulat mewakili sejumlah indeks ke dalam dimensi itu Nilai negatif diizinkan dalam larik indeks dan berfungsi seperti halnya dengan indeks atau irisan tunggal >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 92 Jika nilai indeks di luar batas maka >>> x[..., 0] array([[1, 2, 3], [4, 5, 6]])8 dilemparkan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 93 Ketika indeks terdiri dari larik bilangan bulat sebanyak dimensi larik yang diindeks, pengindeksannya langsung, tetapi berbeda dari pemotongan Indeks lanjutan selalu dan diulang sebagai satu >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 94 Perhatikan bahwa bentuk yang dihasilkan identik dengan bentuk array pengindeksan (siaran) >>> x[..., 0] array([[1, 2, 3], [4, 5, 6]])9. Jika indeks tidak dapat disiarkan ke bentuk yang sama, pengecualian >>> x[:, :, 0] array([[1, 2, 3], [4, 5, 6]])0 dimunculkan Pengindeksan dengan array indeks multidimensi cenderung menjadi penggunaan yang lebih tidak biasa, tetapi diizinkan, dan berguna untuk beberapa masalah. Kita akan mulai dengan kasus multidimensi yang paling sederhana >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 95 Dalam hal ini, jika larik indeks memiliki bentuk yang cocok, dan ada larik indeks untuk setiap dimensi larik yang diindeks, larik yang dihasilkan memiliki bentuk yang sama dengan larik indeks, dan nilainya sesuai dengan set indeks untuk setiap . Dalam contoh ini, nilai indeks pertama adalah 0 untuk kedua array indeks, sehingga nilai pertama dari array yang dihasilkan adalah >>> x[:, :, 0] array([[1, 2, 3], [4, 5, 6]])1. Nilai berikutnya adalah >>> x[:, :, 0] array([[1, 2, 3], [4, 5, 6]])_2, dan yang terakhir adalah >>> x[:, :, 0] array([[1, 2, 3], [4, 5, 6]])3 Jika array indeks tidak memiliki bentuk yang sama, ada upaya untuk menyiarkannya ke bentuk yang sama. Jika mereka tidak dapat disiarkan ke bentuk yang sama, pengecualian akan dimunculkan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 96 Mekanisme penyiaran memungkinkan array indeks digabungkan dengan skalar untuk indeks lainnya. Efeknya adalah nilai skalar digunakan untuk semua nilai yang sesuai dari array indeks >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 97 Melompat ke tingkat kerumitan berikutnya, dimungkinkan untuk hanya mengindeks sebagian array dengan array indeks. Dibutuhkan sedikit pemikiran untuk memahami apa yang terjadi dalam kasus seperti itu. Misalnya jika kita hanya menggunakan satu array indeks dengan y >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 98 Ini menghasilkan konstruksi array baru di mana setiap nilai array indeks memilih satu baris dari array yang diindeks dan array yang dihasilkan memiliki bentuk yang dihasilkan (jumlah elemen indeks, ukuran baris) Secara umum, bentuk array yang dihasilkan akan menjadi gabungan dari bentuk array indeks (atau bentuk yang disiarkan oleh semua array indeks) dengan bentuk dimensi yang tidak digunakan (yang tidak diindeks) dalam array yang diindeks Contoh Dari setiap baris, elemen tertentu harus dipilih. Indeks baris hanya >>> x[:, :, 0] array([[1, 2, 3], [4, 5, 6]])_4 dan indeks kolom menentukan elemen yang akan dipilih untuk baris yang sesuai, di sini >>> x[:, :, 0] array([[1, 2, 3], [4, 5, 6]])5. Menggunakan keduanya bersama-sama, tugas dapat diselesaikan dengan menggunakan pengindeksan lanjutan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9_9 Untuk mencapai perilaku yang mirip dengan pengirisan dasar di atas, penyiaran dapat digunakan. Fungsi ini dapat membantu penyiaran ini. Ini paling baik dipahami dengan sebuah contoh Contoh Dari larik 4x3, elemen sudut harus dipilih menggunakan pengindeksan lanjutan. Jadi semua elemen yang kolomnya adalah salah satu dari >>> x[:, :, 0] array([[1, 2, 3], [4, 5, 6]])7 dan barisnya adalah salah satu dari >>> x[:, :, 0] array([[1, 2, 3], [4, 5, 6]])8 perlu dipilih. Untuk menggunakan pengindeksan lanjutan, seseorang harus memilih semua elemen secara eksplisit. Dengan menggunakan metode yang dijelaskan sebelumnya, seseorang dapat menulis >>> x[0] array([0, 1, 2, 3, 4])0 Namun, karena array pengindeksan di atas hanya berulang, penyiaran dapat digunakan (bandingkan operasi seperti >>> x[:, :, 0] array([[1, 2, 3], [4, 5, 6]])9) untuk menyederhanakan ini >>> x[0] array([0, 1, 2, 3, 4])1 Penyiaran ini juga dapat dicapai dengan menggunakan fungsi tersebut >>> x[0] array([0, 1, 2, 3, 4])2 Perhatikan bahwa tanpa panggilan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9_01, hanya elemen diagonal yang akan dipilih >>> x[0] array([0, 1, 2, 3, 4])3 Perbedaan ini adalah hal yang paling penting untuk diingat tentang pengindeksan dengan beberapa indeks tingkat lanjut Contoh Contoh kehidupan nyata di mana pengindeksan lanjutan mungkin berguna adalah untuk tabel pencarian warna di mana kami ingin memetakan nilai gambar menjadi tiga kali lipat RGB untuk ditampilkan. Tabel pemeta dapat berbentuk (nlookup, 3). Pengindeksan array seperti itu dengan gambar dengan bentuk (ny, nx) dengan dtype=np. uint8 (atau tipe bilangan bulat apa pun asalkan nilainya dengan batas tabel pencarian) akan menghasilkan array bentuk (ny, nx, 3) di mana tiga kali lipat nilai RGB dikaitkan dengan setiap lokasi piksel Pengindeksan array BooleanPengindeksan lanjutan ini terjadi ketika obj adalah objek array bertipe Boolean, seperti yang mungkin dikembalikan dari operator pembanding. Array indeks boolean tunggal praktis identik dengan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 902 di mana, seperti dijelaskan di atas, mengembalikan tuple (panjang ) dari array indeks integer yang menunjukkan elemen objek. Namun, lebih cepat bila >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9_06 Jika >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9_07, >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])6 mengembalikan array 1 dimensi yang diisi dengan elemen x yang sesuai dengan nilai objek. Urutan pencariannya adalah , C-style. Jika obj memiliki nilai pada entri yang berada di luar batas x, maka kesalahan indeks akan dimunculkan. Jika obj lebih kecil dari x itu identik dengan mengisinya Kasus penggunaan umum untuk ini adalah memfilter nilai elemen yang diinginkan. Sebagai contoh, seseorang mungkin ingin memilih semua entri dari sebuah array yang bukan >>> x[0] array([0, 1, 2, 3, 4])4 Atau ingin menambahkan konstanta ke semua elemen negatif >>> x[0] array([0, 1, 2, 3, 4])5 Secara umum jika indeks menyertakan array Boolean, hasilnya akan sama dengan memasukkan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 903 ke posisi yang sama dan menggunakan mekanisme pengindeksan array integer yang dijelaskan di atas. >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 914 setara dengan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 915 Jika hanya ada satu larik Boolean dan tidak ada larik pengindeks bilangan bulat, ini mudah. Kehati-hatian hanya harus dilakukan untuk memastikan bahwa indeks boolean memiliki dimensi yang tepat sebanyak yang seharusnya digunakan Secara umum, ketika array boolean memiliki dimensi lebih sedikit daripada array yang diindeks, ini setara dengan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 916, yang berarti x diindeks oleh b diikuti oleh >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])7 sebanyak yang diperlukan untuk mengisi peringkat x. Dengan demikian bentuk hasilnya adalah satu dimensi yang berisi jumlah elemen True dari array boolean, diikuti dengan sisa dimensi array yang diindeks. >>> x[0] array([0, 1, 2, 3, 4])6 Di sini baris ke-4 dan ke-5 dipilih dari larik yang diindeks dan digabungkan untuk membuat larik 2-D Contoh Dari sebuah array, pilih semua baris yang berjumlah kurang dari atau sama dengan dua >>> x[0] array([0, 1, 2, 3, 4])7 Menggabungkan beberapa array pengindeksan Boolean atau Boolean dengan array pengindeksan integer dapat dipahami dengan analogi. Fungsi ini juga mendukung array boolean dan akan bekerja tanpa kejutan Contoh Gunakan pengindeksan boolean untuk memilih semua baris yang berjumlah genap. Pada saat yang sama kolom 0 dan 2 harus dipilih dengan indeks bilangan bulat lanjutan. Menggunakan fungsi ini dapat dilakukan dengan >>> x[0] array([0, 1, 2, 3, 4])8 Tanpa panggilan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9_01, hanya elemen diagonal yang akan dipilih Atau tanpa >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 901 (bandingkan contoh array integer) >>> x[0] array([0, 1, 2, 3, 4])_9 Contoh Gunakan larik bentuk boolean 2-D (2, 3) dengan empat elemen True untuk memilih baris dari larik bentuk 3-D (2, 3, 5) menghasilkan hasil bentuk 2-D (4, 5) >>> x[0][2] 2_0 Menggabungkan pengindeksan lanjutan dan dasarKetika setidaknya ada satu irisan ( >>> x[-2:10] array([8, 9]) >>> x[-3:3:-1] array([7, 6, 5, 4])_7), elipsis ( >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 924) atau dalam indeks (atau array memiliki lebih banyak dimensi daripada indeks lanjutan), maka perilakunya bisa lebih rumit. Ini seperti menggabungkan hasil pengindeksan untuk setiap elemen indeks lanjutan Dalam kasus paling sederhana, hanya ada satu indeks lanjutan yang digabungkan dengan sebuah slice. Sebagai contoh >>> x[0][2] 2_1 Akibatnya, operasi slice dan array indeks bersifat independen. Operasi irisan mengekstrak kolom dengan indeks 1 dan 2, (mis. e. kolom ke-2 dan ke-3), diikuti oleh operasi array indeks yang mengekstrak baris dengan indeks 0, 2 dan 4 (i. e baris pertama, ketiga dan kelima). Ini setara dengan >>> x[0][2] 2_2 Sebuah indeks lanjutan tunggal dapat, misalnya, mengganti sebuah slice dan larik hasilnya akan sama. Namun, itu adalah salinan dan mungkin memiliki tata letak memori yang berbeda. Sepotong lebih disukai jika memungkinkan. Sebagai contoh >>> x[0][2] 2_3 Cara termudah untuk memahami kombinasi beberapa indeks tingkat lanjut adalah dengan memikirkan bentuk yang dihasilkan. Ada dua bagian untuk operasi pengindeksan, subruang yang ditentukan oleh pengindeksan dasar (tidak termasuk bilangan bulat) dan subruang dari bagian pengindeksan lanjutan. Dua kasus kombinasi indeks perlu dibedakan
Dalam kasus pertama, dimensi yang dihasilkan dari operasi pengindeksan lanjutan didahulukan dalam larik hasil, dan dimensi subruang setelahnya. Dalam kasus kedua, dimensi dari operasi pengindeksan lanjutan dimasukkan ke dalam larik hasil di tempat yang sama seperti di larik awal (logika terakhir inilah yang membuat pengindeksan lanjutan sederhana berperilaku seperti mengiris) Contoh Misalkan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9_32 adalah (10, 20, 30) dan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 933 adalah array pengindeksan berbentuk (2, 3, 4), maka >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 935 memiliki bentuk (10, 2, 3, 4, 30) karena subruang berbentuk (20,) . Jika kita biarkan i, j, k berputar di atas subruang berbentuk (2, 3, 4) maka >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 936. Contoh ini menghasilkan hasil yang sama seperti Contoh Biarkan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9_32 menjadi (10, 20, 30, 40, 50) dan misalkan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 939 dan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 940 dapat disiarkan ke bentuk (2, 3, 4). Maka >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9_41 berbentuk (10, 2, 3, 4, 40, 50) karena subruang berbentuk (20, 30) dari X telah diganti dengan subruang (2, 3, 4) dari indeks. Namun, >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9_42 memiliki bentuk (2, 3, 4, 10, 30, 50) karena tidak ada tempat yang jelas untuk dijatuhkan di subruang pengindeksan, sehingga ditempelkan ke awal. Itu selalu memungkinkan untuk digunakan untuk memindahkan subruang ke mana pun diinginkan. Perhatikan bahwa contoh ini tidak dapat direplikasi menggunakan Contoh Mengiris dapat dikombinasikan dengan indeks boolean yang disiarkan >>> x[0][2] 2_4 Akses lapanganLihat juga Jika objeknya adalah array terstruktur, array of dapat diakses dengan mengindeks array dengan string, seperti kamus Pengindeksan >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9_46 mengembalikan yang baru ke array, yang bentuknya sama dengan x (kecuali jika bidangnya adalah sub-array) tetapi bertipe data >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 947 dan hanya berisi sebagian data di bidang yang ditentukan. Juga, skalar dapat "diindeks" dengan cara ini Pengindeksan ke dalam array terstruktur juga dapat dilakukan dengan daftar nama bidang, mis. g. >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9_48. Pada NumPy 1. 16, ini mengembalikan tampilan yang hanya berisi bidang tersebut. Di versi NumPy yang lebih lama, itu mengembalikan salinan. Lihat bagian panduan pengguna untuk informasi lebih lanjut tentang pengindeksan multifield Jika bidang yang diakses adalah sub-array, dimensi sub-array ditambahkan ke bentuk hasil. Sebagai contoh >>> x[0][2] 2_5 Pengindeksan Iterator datarmengembalikan sebuah iterator yang akan mengulang seluruh array (dalam gaya C-contiguous dengan indeks terakhir bervariasi paling cepat). Objek iterator ini juga dapat diindeks menggunakan pengirisan dasar atau pengindeksan lanjutan selama objek pemilihan bukan tuple. Ini harus jelas dari fakta bahwa itu adalah pandangan 1 dimensi. Ini dapat digunakan untuk pengindeksan bilangan bulat dengan indeks C-style-flat 1 dimensi. Oleh karena itu, bentuk dari setiap larik yang dikembalikan adalah bentuk objek pengindeksan bilangan bulat Menetapkan nilai ke array yang diindeksSeperti yang disebutkan, seseorang dapat memilih subset dari array untuk ditetapkan menggunakan satu indeks, irisan, dan array indeks dan topeng. Nilai yang diberikan ke array yang diindeks harus konsisten bentuknya (bentuk yang sama atau dapat disiarkan ke bentuk yang dihasilkan indeks). Sebagai contoh, diizinkan untuk memberikan sebuah konstanta pada sebuah slice >>> x[0][2] 2_6 atau array dengan ukuran yang tepat >>> x[0][2] 2_7 Perhatikan bahwa penugasan dapat mengakibatkan perubahan jika menugaskan tipe yang lebih tinggi ke tipe yang lebih rendah (seperti float ke int) atau bahkan pengecualian (menetapkan kompleks ke float atau int) >>> x[0][2] 2_8 Tidak seperti beberapa referensi (seperti indeks array dan mask), penugasan selalu dibuat untuk data asli dalam array (memang, tidak ada lagi yang masuk akal. ). Perhatikan juga, bahwa beberapa tindakan mungkin tidak berfungsi seperti yang diharapkan secara naif. Contoh khusus ini seringkali mengejutkan orang >>> x[0][2] 2_9 Di mana orang berharap bahwa lokasi pertama akan bertambah 3. Bahkan, itu hanya akan bertambah 1. Alasannya adalah array baru diekstraksi dari aslinya (sebagai sementara) yang berisi nilai pada 1, 1, 3, 1, kemudian nilai 1 ditambahkan ke yang sementara, dan kemudian yang sementara ditugaskan kembali ke array asli. Dengan demikian nilai array di >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 9_51 ditugaskan ke >>> x.shape = (2, 5) # now x is 2-dimensional >>> x[1, 3] 8 >>> x[1, -1] 952 tiga kali, bukannya bertambah 3 kali Berurusan dengan jumlah variabel indeks dalam programSintaks pengindeksan sangat kuat tetapi membatasi ketika berhadapan dengan sejumlah variabel indeks. Misalnya, jika Anda ingin menulis sebuah fungsi yang dapat menangani argumen dengan berbagai jumlah dimensi tanpa harus menulis kode kasus khusus untuk setiap jumlah kemungkinan dimensi, bagaimana cara melakukannya? . Sebagai contoh >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])_0 Jadi seseorang dapat menggunakan kode untuk membuat tupel dari sejumlah indeks dan kemudian menggunakannya dalam indeks Slice dapat ditentukan di dalam program dengan menggunakan fungsi slice() di Python. Sebagai contoh >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])_1 Demikian juga, elipsis dapat ditentukan oleh kode dengan menggunakan objek Ellipsis >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])_2 Untuk alasan ini, dimungkinkan untuk menggunakan keluaran dari fungsi secara langsung sebagai indeks karena ia selalu mengembalikan tuple array indeks Karena perlakuan khusus tupel, mereka tidak secara otomatis diubah menjadi array seperti daftar. Sebagai contoh >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> x[1:7:2] array([1, 3, 5])_3 Catatan rinciIni adalah beberapa catatan terperinci, yang tidak penting untuk pengindeksan hari ke hari (tanpa urutan tertentu)
|