Bayangkan kita harus memproses nilai ujian 10.000 siswa atau harga 50.000 produk. Dengan list Python, setiap angka sebenarnya adalah objek int lengkap yang letaknya tersebar di memori, sementara list hanya menyimpan penunjuk ke objek-objek tersebut. Pendekatan ini fleksibel untuk data campuran, tetapi menjadi lambat dan boros memori ketika kita ingin mengalikan seluruh koleksi angka sekaligus.
NumPy menjawab masalah itu dengan satu struktur data inti bernama ndarray (n-dimensional array). Berbeda dari list, ndarray menyimpan seluruh datanya di satu blok memori berurutan dengan tipe yang seragam, lalu melengkapinya dengan metadata kecil yang menjelaskan cara membaca blok tersebut. Bab ini membedah anatomi ndarray, karena pemahaman ini menjadi fondasi bagi seluruh bab berikutnya:
- Dua komponen utama ndarray: buffer data dan metadata (
shape,dtype,strides). - Arti setiap bagian metadata dan cara memeriksanya.
- Mengapa sifat homogen membuat operasi NumPy berjalan cepat.
Anatomi sebuah ndarray #
Variabel ndarray terdiri dari dua bagian. Bagian pertama adalah buffer data: blok memori tunggal berisi nilai-nilai mentah yang berdempetan. Bagian kedua adalah metadata: keterangan kecil berisi shape (bentuk), dtype (tipe tiap elemen), dan strides (jumlah byte yang dilompati untuk maju satu langkah pada tiap axis). Mari kita amati keduanya lewat kode berikut:
import numpy as np
a = np.array([10, 20, 30, 40, 50])
print(a)
print("shape :", a.shape)
print("dtype :", a.dtype)Output yang Dihasilkan:
[10 20 30 40 50]
shape : (5,)
dtype : int64Mari kita bedah apa yang dilakukan interpreter pada setiap baris:
- Baris 3 (
np.array([10, 20, 30, 40, 50])): NumPy mengalokasikan satu blok memori bertipeint64berukuran 5 elemen, lalu menyalin nilai dari list ke blok tersebut secara berurutan. - Baris 4 (
print(a)): representasi teks ndarray menampilkan elemen dipisah spasi tanpa koma — ciri khas yang membedakannya dari list Python. - Baris 5 (
a.shape): atributshapeberupa tuple(5,), artinya satu axis memuat 5 elemen. Tanda koma wajib ada karena tuple satu elemen di Python. - Baris 6 (
a.dtype): seluruh elemen bertipeint64(integer 64-bit), bukan tipe campuran seperti pada list.
Diagram berikut memperlihatkan hubungan metadata dengan blok datanya. Metadata bersifat ringkas dan ukurannya tetap, sedangkan blok data tumbuh seiring jumlah elemen:
Dari diagram di atas, metadata shape = (5,) memberi tahu bahwa data disusun dalam satu baris berisi lima angka, dtype = int64 menentukan bahwa tiap angka menempati 8 byte, dan strides = (8,) menunjukkan NumPy melompat 8 byte untuk berpindah ke elemen berikutnya.
Mengapa homogenitas membuat array cepat #
Analogi yang membantu: list Python ibarat rak gudang berisi kotak-kotak campuran — tiap kotak boleh berisi apa pun dan letaknya tersebar, sehingga membaca isinya harus kotak demi kotak. Ndarray ibarat satu kolom spreadsheet yang tipe selnya seragam: karena semua sel berukuran sama dan tersusun rapi, operasi bisa diterapkan ke seluruh kolom sekaligus dalam satu langkah.
Secara teknis, homogenitas memberi dua keuntungan:
- Tanpa pemeriksaan tipe per elemen: interpreter Python harus memeriksa tipe setiap objek saat operasi pada list; NumPy cukup memeriksa
dtypesatu kali, lalu operasi matematika dijalankan sebagai loop C di atas memori berurutan. - Akses memori efisien: data yang berdempetan memanfaatkan cache prosesor dengan baik, sehingga membaca satu juta elemen lebih murah daripada mengikuti penunjuk yang tersebar.
Ukuran-ukuran dalam metadata dapat kita verifikasi langsung:
import numpy as np
a = np.array([10, 20, 30, 40, 50], dtype=np.int64)
print("itemsize :", a.itemsize)
print("nbytes :", a.nbytes)
print("strides :", a.strides)
print("ndim :", a.ndim)Output yang Dihasilkan:
itemsize : 8
nbytes : 40
strides : (8,)
ndim : 1- Baris 4 (
a.itemsize): jumlah byte per elemen;int64menempati 8 byte. - Baris 5 (
a.nbytes): total byte buffer data, yaitu 5 elemen × 8 byte = 40 byte. - Baris 6 (
a.strides): tuple(8,)berarti maju satu langkah pada axis tunggal sama dengan melompati 8 byte. - Baris 7 (
a.ndim): jumlah axis, yang untuk array satu dimensi bernilai 1.
Tabel berikut merangkum perbedaan kedua struktur data tersebut:
| Aspek | list Python | ndarray NumPy |
|---|---|---|
| Tipe elemen | bebas campuran | satu dtype untuk semua elemen |
| Letak data | penunjuk ke objek tersebar | satu blok memori berurutan |
| Operasi matematis | loop manual per elemen | perhitungan C pada seluruh elemen |
| Ukuran memori | besar (tiap objek punya header) | ringkas (hanya buffer data) |