Bab sebelumnya memperkenalkan notasi a[i] untuk membaca satu elemen. Bab ini merapikan aturan main indexing pada array satu dimensi: dari angka mana indeks mulai dihitung, rentang indeks yang valid, hingga kesalahan out of bounds yang paling sering dialami pemula. Contoh berjalan masih memakai array nilai ujian delapan mahasiswa agar kita bisa membandingkan langsung dengan bab sebelumnya.
Indeks Mulai dari Nol #
Dalam kehidupan sehari-hari kita menghitung posisi dari satu, tetapi NumPy — sebagaimana hampir semua bahasa pemrograman — menghitung indeks dari nol. Elemen pertama berada pada indeks 0, sehingga elemen ke-n berada pada indeks n-1. Kita buktikan dengan mencetak setiap pasangan indeks dan nilai:
import numpy as np
nilai = np.array([78, 85, 92, 69, 88, 95, 73, 81])
print(len(nilai))
for i in range(len(nilai)):
print(i, nilai[i])Output yang Dihasilkan:
8
0 78
1 85
2 92
3 69
4 88
5 95
6 73
7 81Bedah baris demi baris:
- Baris 3 (
nilai = np.array(...)): array satu dimensi dengan delapan elemen dibuat dari list Python. - Baris 4 (
print(len(nilai))): fungsilen()menghitung jumlah elemen, yaitu8. Pada array satu dimensi, angka ini sekaligus panjang sumbu tempat indexing bekerja. - Baris 5-6 (
for i in range(len(nilai))):range(8)menghasilkan bilangan0sampai7— tepat seluruh indeks yang valid — dan setiap iterasi mencetak pasangan indeks beserta nilainya.
Konsekuensi penomoran dari nol ini perlu kita pegang kuat:
| Posisi bagi manusia | Indeks NumPy | Nilai |
|---|---|---|
| ke-1 | 0 | 78 |
| ke-5 | 4 | 88 |
| ke-8 | 7 | 81 |
Ketika seseorang meminta “nilai kelima”, kode yang benar adalah nilai[4], bukan nilai[5]. Salah hitung satu langkah seperti ini disebut off-by-one error dan merupakan sumber bug paling umum dalam indexing.
Rentang Indeks yang Valid #
Untuk array dengan N elemen, indeks yang valid adalah 0 sampai N-1. Elemen terakhir dengan demikian berada pada indeks len(nilai) - 1:
import numpy as np
nilai = np.array([78, 85, 92, 69, 88, 95, 73, 81])
terakhir = len(nilai) - 1
print(nilai[terakhir])
print(nilai[len(nilai) - 1])Output yang Dihasilkan:
81
81Kedua baris print menghasilkan 81 karena keduanya menunjuk indeks 7. Pola nilai[len(nilai) - 1] memang benar, tetapi terasa panjang untuk sekadar mengambil elemen akhir. NumPy menyediakan bentuk yang lebih ringkas melalui indeks negatif, dan akan dibahas lebih lanjut pada Chapter Negative Indexing.
IndexError saat Indeks di Luar Batas #
Bagaimana jika kita meminta indeks di luar rentang valid? NumPy tidak mendiamkan permintaan tersebut; interpreter memunculkan exception IndexError. Dengan try/except kita dapat menangkapnya dan membaca pesannya tanpa menghentikan program:
import numpy as np
nilai = np.array([78, 85, 92, 69, 88, 95, 73, 81])
try:
print(nilai[8])
except IndexError as e:
print("IndexError:", e)
try:
print(nilai[-9])
except IndexError as e:
print("IndexError:", e)Output yang Dihasilkan:
IndexError: index 8 is out of bounds for axis 0 with size 8
IndexError: index -9 is out of bounds for axis 0 with size 8Pesan galat NumPy sangat informatif bila kita membacanya per bagian:
| Potongan pesan | Arti |
|---|---|
index 8 | indeks yang diminta oleh kode kita |
is out of bounds | indeks berada di luar batas rentang valid |
axis 0 | sumbu (dimensi) tempat indexing dilakukan |
with size 8 | jumlah elemen aktual pada sumbu tersebut |
Baris kedua contoh menunjukkan bahwa indeks negatif punya batas juga: untuk array delapan elemen, indeks negatif valid hanya dari -8 sampai -1, sehingga nilai[-9] gagal dengan pesan out of bounds yang sama.
Ringkasan aturan pada bab ini:
- Indeks valid berada pada rentang
0sampailen(nilai) - 1. - Posisi ke-n menurut manusia bersesuaian dengan indeks
n - 1. - Indeks di luar rentang — positif maupun negatif — memunculkan
IndexErroryang menyebut sumbu (axis 0) dan ukurannya (size).