Data nyata jarang berbentuk satu deret angka. Rekap penjualan tiga cabang toko selama empat hari, misalnya, secara alami tersusun sebagai tabel: baris untuk cabang dan kolom untuk hari. NumPy menyimpan tabel semacam itu sebagai array dua dimensi, dan satu angka di dalamnya diambil dengan dua koordinat sekaligus: a[baris, kolom].

Bab ini membahas konvensi penulisan indeks multidimensi, membandingkan bentuk a[1, 2] dengan bentuk berantai a[1][2], lalu meluaskan pola yang sama ke array tiga dimensi.

Notasi [baris, kolom] #

Kita mulai dari matriks penjualan berukuran 3 x 4 — tiga baris cabang, empat kolom hari:

python
import numpy as np

penjualan = np.array([
    [12, 15, 9, 20],
    [8, 14, 11, 17],
    [19, 6, 13, 10],
])
print(penjualan.shape)
print(penjualan[1, 2])
print(penjualan[0, 3])
print(penjualan[2, 0])

Output yang Dihasilkan:

text
(3, 4)
11
20
19

Susunan datanya dapat kita gambarkan sebagai berikut:

kolom 0kolom 1kolom 2kolom 3
baris 01215920
baris 18141117
baris 21961310

Bedah baris demi baris:

  1. Baris 3-8 (np.array([...]) dan print(penjualan.shape)): list berisi list diterjemahkan menjadi array dua dimensi; setiap list bagian dalam menjadi satu baris. Atribut shape bernilai (3, 4) — tiga baris, empat kolom.
  2. Baris 9 (penjualan[1, 2]): dua indeks dipisah koma. Indeks pertama bergerak pada axis 0 (baris), indeks kedua pada axis 1 (kolom). Hasilnya elemen baris 1 kolom 2, yaitu 11.
  3. Baris 10 (penjualan[0, 3]): baris pertama, kolom keempat → 20.
  4. Baris 11 (penjualan[2, 0]): baris ketiga, kolom pertama → 19.

Di balik layar, interpreter Python menerjemahkan penjualan[1, 2] menjadi satu operasi indexing yang menerima tuple (1, 2). NumPy memakai koordinat lengkap itu untuk langsung menghitung posisi sel di memori.

a[1, 2] versus a[1][2] #

Kedua bentuk penulisan memberi nilai sama, tetapi jalannya berbeda. Kita amati perilaku keduanya:

python
import numpy as np

penjualan = np.array([
    [12, 15, 9, 20],
    [8, 14, 11, 17],
    [19, 6, 13, 10],
])
baris_b = penjualan[1]
print(baris_b)
print(type(baris_b))
print(baris_b[2])
print(penjualan[1][2])
print(penjualan[1, 2] == penjualan[1][2])

Output yang Dihasilkan:

text
[ 8 14 11 17]
<class 'numpy.ndarray'>
11
11
True

Bedah langkah demi langkah:

  1. baris_b = penjualan[1]: indexing dengan satu indeks pada array dua dimensi menghasilkan satu baris utuh sebagai array satu dimensi — tercetak [ 8 14 11 17] dengan tipe numpy.ndarray.
  2. baris_b[2]: baris tersebut kemudian diindeks seperti array satu dimensi biasa, menghasilkan 11.
  3. penjualan[1][2]: kedua langkah di atas dirangkai dalam satu ekspresi. Operator kurung pertama mengambil baris, operator kurung kedua mengindeks baris perantara itu — ada dua operasi indexing beruntun.
  4. penjualan[1, 2]: satu operasi indexing dengan tuple; NumPy langsung menghitung sel (baris 1, kolom 2) tanpa membuat array perantara. Perbandingan pada baris terakhir memastikan keduanya bernilai sama (True).

Meluas ke Tiga Dimensi #

Pola yang sama berlanjut ke dimensi lebih tinggi: satu indeks per axis, dipisah koma. Kita tambah satu lapis data — penjualan dua wilayah, masing-masing berisi tiga cabang selama empat hari:

python
import numpy as np

penjualan_3d = np.array([
    [[10, 12, 9, 14], [8, 11, 7, 12], [13, 9, 12, 10]],
    [[15, 8, 11, 13], [9, 14, 10, 8], [12, 10, 15, 11]],
])
print(penjualan_3d.shape)
print(penjualan_3d[1, 0, 3])
print(penjualan_3d[0, 2, 1])
print(penjualan_3d[0, 1])

Output yang Dihasilkan:

text
(2, 3, 4)
13
9
[ 8 11  7 12]

Arti tiap axis pada array ini:

  • Axis 0 (panjang 2): wilayah.
  • Axis 1 (panjang 3): cabang di dalam wilayah.
  • Axis 2 (panjang 4): hari di dalam cabang.

Dengan demikian:

  1. penjualan_3d[1, 0, 3]: wilayah kedua, cabang pertama, hari keempat → 13.
  2. penjualan_3d[0, 2, 1]: wilayah pertama, cabang ketiga, hari kedua → 9.
  3. penjualan_3d[0, 1]: hanya dua indeks yang diberikan, sehingga hasilnya seluruh sisa data satu cabang — array satu dimensi [ 8 11 7 12]. Menyediakan indeks lebih sedikit daripada ndim menghasilkan array dengan dimensi lebih rendah.