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:
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:
(3, 4)
11
20
19Susunan datanya dapat kita gambarkan sebagai berikut:
| kolom 0 | kolom 1 | kolom 2 | kolom 3 | |
|---|---|---|---|---|
| baris 0 | 12 | 15 | 9 | 20 |
| baris 1 | 8 | 14 | 11 | 17 |
| baris 2 | 19 | 6 | 13 | 10 |
Bedah baris demi baris:
- Baris 3-8 (
np.array([...])danprint(penjualan.shape)): list berisi list diterjemahkan menjadi array dua dimensi; setiap list bagian dalam menjadi satu baris. Atributshapebernilai(3, 4)— tiga baris, empat kolom. - 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, yaitu11. - Baris 10 (
penjualan[0, 3]): baris pertama, kolom keempat →20. - 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:
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:
[ 8 14 11 17]
<class 'numpy.ndarray'>
11
11
TrueBedah langkah demi langkah:
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 tipenumpy.ndarray.baris_b[2]: baris tersebut kemudian diindeks seperti array satu dimensi biasa, menghasilkan11.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.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:
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:
(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:
penjualan_3d[1, 0, 3]: wilayah kedua, cabang pertama, hari keempat →13.penjualan_3d[0, 2, 1]: wilayah pertama, cabang ketiga, hari kedua →9.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 daripadandimmenghasilkan array dengan dimensi lebih rendah.