Temukan indeks elemen dalam array python 2d

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 dasar

Pengindeksan elemen tunggal

Pengindeksan 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. Misalnya

>>> 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 melangkah

Pemotongan 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

  • Sintaks slice dasar adalah

    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    5 di mana i adalah indeks awal, j adalah indeks penghentian, dan k adalah langkah ( \(k\neq0\)). This selects the m elements (in the corresponding dimension) with index values i, i + k, …, i + (m - 1) k where \(m = q + (r\neq0 . j - i = q k + r, sehingga i + (m - 1) k < j. Misalnya. and q and r are the quotient and remainder obtained by dividing j - i by k: j - i = q k + r, so that i + (m - 1) k < j. For example:

    >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> x[1:7:2]
    array([1, 3, 5])
    

  • Negatif i dan j ditafsirkan sebagai n + i dan n + j di mana n adalah jumlah elemen dalam dimensi yang sesuai. K negatif membuat langkah menuju indeks yang lebih kecil. Dari contoh di atas

    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    _

  • Asumsikan n adalah jumlah elemen dalam dimensi yang diiris. Kemudian, jika i tidak diberikan defaultnya adalah 0 untuk k > 0 dan n - 1 untuk k < 0. Jika j tidak diberikan defaultnya adalah n untuk k > 0 dan -n-1 untuk k < 0. Jika k tidak diberikan, defaultnya adalah 1. Perhatikan bahwa

    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    _6 sama dengan
    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    7 dan artinya pilih semua indeks di sepanjang sumbu ini. Dari contoh di atas

    >>> x[5:]
    array([5, 6, 7, 8, 9])
    

  • Jika jumlah objek dalam pemilihan tupel kurang dari N, maka

    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    7 diasumsikan untuk setiap dimensi berikutnya. Sebagai contoh

    >>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
    >>> x.shape
    (2, 3, 1)
    >>> x[1:2]
    array([[[4],
            [5],
            [6]]])
    

  • Bilangan bulat, i, mengembalikan nilai yang sama dengan

    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    9 kecuali dimensi objek yang dikembalikan dikurangi 1. Secara khusus, tupel pilihan dengan elemen p-th sebuah bilangan bulat (dan semua entri lainnya
    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    7) mengembalikan sub-array yang sesuai dengan dimensi N - 1. Jika N = 1 maka objek yang dikembalikan adalah skalar array. Obyek-obyek tersebut dijelaskan dalam

  • Jika tupel pilihan memiliki semua entri

    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    7 kecuali entri p-th yang merupakan objek irisan
    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    5, maka array yang dikembalikan memiliki dimensi N yang dibentuk dengan menggabungkan sub-array yang dikembalikan oleh pengindeksan bilangan bulat elemen i, i+k, …, i

  • Pemotongan dasar dengan lebih dari satu entri non-

    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    7 di tupel pengiris, bertindak seperti penerapan pemotongan berulang menggunakan satu entri non-
    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    7, di mana entri non-
    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    7 diambil secara berurutan (dengan semua entri non-
    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    7 lainnya digantikan oleh
    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    7). Jadi,
    >>> x[5:]
    array([5, 6, 7, 8, 9])
    
    _8 bertindak seperti
    >>> x[5:]
    array([5, 6, 7, 8, 9])
    
    9 di bawah pemotongan dasar

    Peringatan

    Hal di atas tidak berlaku untuk pengindeksan lanjutan

  • Anda dapat menggunakan pemotongan untuk menetapkan nilai dalam larik, tetapi (tidak seperti daftar) Anda tidak akan pernah dapat menumbuhkan larik. Ukuran nilai yang akan ditetapkan di

    >>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
    >>> x.shape
    (2, 3, 1)
    >>> x[1:2]
    array([[[4],
            [5],
            [6]]])
    
    0 harus (dapat disiarkan ke) bentuk yang sama seperti
    >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> x[1:7:2]
    array([1, 3, 5])
    
    6

  • Tuple pengiris selalu dapat dibuat sebagai objek dan digunakan dalam notasi

    >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> x[1:7:2]
    array([1, 3, 5])
    
    6. Objek irisan dapat digunakan dalam konstruksi sebagai pengganti notasi
    >>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
    >>> x.shape
    (2, 3, 1)
    >>> x[1:2]
    array([[[4],
            [5],
            [6]]])
    
    3. Misalnya,
    >>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
    >>> x.shape
    (2, 3, 1)
    >>> x[1:2]
    array([[[4],
            [5],
            [6]]])
    
    _4 juga dapat diimplementasikan sebagai
    >>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
    >>> x.shape
    (2, 3, 1)
    >>> x[1:2]
    array([[[4],
            [5],
            [6]]])
    
    5. Ini dapat berguna untuk membangun kode generik yang bekerja pada array dimensi arbitrer. Lihat untuk informasi lebih lanjut

Alat pengindeksan dimensi

Ada 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]
9
_0

Ini berguna untuk menggabungkan dua larik dengan cara yang sebaliknya akan memerlukan operasi pembentukan ulang secara eksplisit. Misalnya

>>> x.shape = (2, 5)  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
_1

Pengindeksan tingkat lanjut

Pengindeksan 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

>>> 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 bulat

Pengindeksan 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]
9
_2

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]
9
_3

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]
9
_4

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]
9
_5

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]
9
_6

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]
9
_7

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]
9
_8

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 Boolean

Pengindeksan 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]
9
02 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]
9
03 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]
9
_14 setara dengan
>>> x.shape = (2, 5)  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
15

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]
9
16, 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]
9
_01 (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 dasar

Ketika 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]
9
24) 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. Misalnya

>>> 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. Misalnya

>>> 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

  • Indeks lanjutan dipisahkan oleh irisan, atau. Misalnya

    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    _28

  • Indeks lanjutan semuanya bersebelahan. Misalnya

    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    _29 tetapi bukan
    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    30 karena
    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    31 adalah indeks lanjutan dalam hal ini

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]
9
33 adalah array pengindeksan berbentuk (2, 3, 4), maka
>>> x.shape = (2, 5)  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
35 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]
9
36. 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]
9
39 dan
>>> x.shape = (2, 5)  # now x is 2-dimensional
>>> x[1, 3]
8
>>> x[1, -1]
9
40 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 lapangan

Lihat 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]
9
47 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. Misalnya

>>> x[0][2]
2
_5

Pengindeksan Iterator datar

mengembalikan 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 tupel. 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 diindeks

Seperti 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]
9
52 tiga kali, bukannya bertambah 3 kali

Berurusan dengan jumlah variabel indeks dalam program

Sintaks 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? . Misalnya

>>> 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. Misalnya

>>> 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 rinci

Ini adalah beberapa catatan terperinci, yang tidak penting untuk pengindeksan hari ke hari (tanpa urutan tertentu)

  • Tipe pengindeksan NumPy asli adalah

    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    34 dan mungkin berbeda dari tipe array integer default.
    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    _34 adalah tipe data terkecil yang cukup untuk mengindeks array apa pun dengan aman;

  • Untuk penugasan lanjutan, umumnya tidak ada jaminan untuk urutan iterasi. Ini berarti bahwa jika suatu elemen diatur lebih dari satu kali, tidak mungkin untuk memprediksi hasil akhirnya

  • Indeks kosong (Tuple) adalah indeks skalar penuh ke dalam array nol dimensi.

    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    _56 mengembalikan skalar jika
    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    57 adalah nol dimensi dan tampilan sebaliknya. Di sisi lain,
    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    _58 selalu mengembalikan tampilan

  • Jika array nol dimensi hadir dalam indeks dan itu adalah indeks bilangan bulat penuh hasilnya akan menjadi skalar dan bukan array nol dimensi. (Pengindeksan lanjutan tidak dipicu. )

  • Ketika elipsis (

    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    _24) ada tetapi tidak memiliki ukuran (i. e. menggantikan nol
    >>> x[-2:10]
    array([8, 9])
    >>> x[-3:3:-1]
    array([7, 6, 5, 4])
    
    _7) hasilnya akan selalu berupa array. Tampilan jika tidak ada indeks lanjutan, jika tidak salinan

  • Persamaan

    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    61 untuk array Boolean tidak berlaku untuk array boolean nol dimensi

  • Ketika hasil dari operasi pengindeksan lanjutan tidak memiliki elemen tetapi indeks individu di luar batas, apakah

    >>> x[..., 0]
    array([[1, 2, 3],
          [4, 5, 6]])
    
    8 dinaikkan atau tidak tidak ditentukan (e. g.
    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    _63 dengan
    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    64 berada di luar batas)

  • Ketika kesalahan casting terjadi selama penugasan (misalnya memperbarui larik numerik menggunakan urutan string), larik yang ditugaskan mungkin berakhir dalam keadaan pembaruan sebagian yang tidak dapat diprediksi. Namun, jika terjadi kesalahan lain (seperti indeks di luar batas), larik akan tetap tidak berubah

  • Tata letak memori hasil pengindeksan lanjutan dioptimalkan untuk setiap operasi pengindeksan dan tidak ada urutan memori tertentu yang dapat diasumsikan

  • Saat menggunakan subkelas (terutama yang memanipulasi bentuknya), perilaku default

    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    65 akan memanggil
    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    66 untuk pengindeksan dasar tetapi tidak untuk pengindeksan lanjutan. Untuk subkelas seperti itu mungkin lebih baik memanggil
    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    65 dengan tampilan ndarray kelas dasar pada data. Ini harus dilakukan jika subkelas
    >>> x.shape = (2, 5)  # now x is 2-dimensional
    >>> x[1, 3]
    8
    >>> x[1, -1]
    9
    
    _66 tidak mengembalikan tampilan

    Bagaimana Anda menemukan indeks elemen dalam array 2D dengan Python?

    Dengan Python, kita dapat mengakses elemen array dua dimensi menggunakan dua indeks . Indeks pertama mengacu pada pengindeksan daftar dan indeks kedua mengacu pada posisi elemen. Jika kita mendefinisikan hanya satu indeks dengan nama array, ia mengembalikan semua elemen 2 dimensi yang disimpan dalam array.

    Bagaimana Anda menemukan indeks elemen dalam array Python?

    Dapatkan indeks elemen di loop Python . Jika elemen cocok, cetak indeks. Create a NumPy array and iterate over the array to compare the element in the array with the given array. If the element matches print the index.

    Apakah indexOf berfungsi pada array 2D?

    Anda tidak dapat menggunakan indexOf untuk membuat larik yang rumit (kecuali jika Anda membuatnya bersambung membuat setiap koordinat menjadi string), Anda perlu menggunakan perulangan for (atau while) untuk mencari .

    Bagaimana Anda menemukan elemen array 2D?

    Sebuah elemen dalam larik 2 dimensi diakses dengan menggunakan subskrip . Yaitu, indeks baris dan indeks kolom dari array. int x = a[1,1]; .