NumPy: Fondasi Komputasi Data
Array NumPy dan vectorization: hitung jutaan angka tanpa loop yang lambat.
List Python itu gerobak, NumPy itu truk kontainer
Analogi: list bawaan Python seperti gerobak dorong, bisa angkut apa saja tapi lambat dan tiap barang dibungkus satu-satu. NumPy array seperti truk kontainer: semua muatan sejenis, tersusun rapat, diangkut sekaligus. Untuk data kecil bedanya tidak terasa, tapi untuk sejuta angka, loop for Python bisa 50-100x lebih lambat dibanding operasi NumPy yang berjalan di kode C yang dioptimasi.
Kenapa penting buat data analyst? Tiga alasan: pertama, pandas dibangun di atas NumPy, jadi paham array berarti paham separuh cara kerja pandas. Kedua, ringkasan statistik (rata-rata, standar deviasi) jadi satu baris. Ketiga, kecepatan: dataset 100 ribu baris yang di-loop manual bisa bikin notebook ngadat, versi NumPy selesai sekejap.
Contoh pertama, operasi langsung ke seluruh array (ini yang disebut vectorization):
import numpy as np
harga = np.array([15000, 8000, 12000, 25000, 10000])
print(harga * 2) # diskon? tinggal kali, semua elemen kena
print(harga + 2000) # tambah ongkir ke semua
print(harga > 10000) # [ True False True True False]Bandingkan dengan list biasa: [15000, 8000] * 2 malah menggandakan isi list, bukan mengalikan angkanya. Itu jebakan klasik yang dibahas di bawah.
Contoh kedua, lebih realistis: normalisasi nilai ujian 5 siswa ke skala 0-100 dan hitung statistiknya, tanpa satu pun loop:
nilai = np.array([70, 85, 90, 60, 95])
skala = nilai / nilai.max() * 100 # vectorization penuh
print("Ternormalisasi:", skala.round(1))
print("Rata-rata:", skala.mean().round(1))
print("Tertinggi:", skala.max(), "| Terendah:", skala.min())
print("Std dev:", skala.std().round(2))Satu ekspresi nilai / nilai.max() * 100 menggantikan loop lima baris. Inilah pola pikir yang harus dilatih: kalau kamu menulis for untuk mengutak-atik angka satu per satu, biasanya ada cara NumPy yang lebih singkat.
Array juga punya bentuk. Data tabel 2 baris x 3 kolom:
m = np.array([[1, 2, 3], [4, 5, 6]])
print(m.shape) # (2, 3)
print(m.reshape(3, 2)) # ubah jadi 3 baris x 2 kolomTidak heran DataFrame pandas pada dasarnya adalah array 2D yang diberi label baris dan kolom.
Jebakan umum
SALAH: pakai list untuk operasi matematika.
harga = [15000, 8000, 12000]
print(harga * 2) # [15000, 8000, 12000, 15000, 8000, 12000] (!!)BENAR: ubah ke array dulu, baru operasikan.
harga = np.array([15000, 8000, 12000])
print(harga * 2) # [30000 16000 24000]SALAH: campur tipe data dalam satu array dan berharap angkanya tetap angka.
campur = np.array([10, 20, "tiga puluh"])
print(campur * 2) # ['1010' '2020' 'tiga puluhtiga puluh'] (jadi string semua!)BENAR: jaga satu tipe per array. NumPy memaksa satu tipe untuk semua elemen demi kecepatan, jadi satu string liar menular ke semuanya. Bersihkan data dulu sebelum masuk NumPy.
Catatan teknis: Fungsi seperti
np.mean()dan method.mean()hasilnya sama untuk array NumPy. Bedanya terasa saat data mencapai ratusan ribu elemen: NumPy menyimpan data rapat dalam satu tipe (misal semua int64), sedangkan list Python menyimpan objek terpisah yang boros memori.
Tantangan
Normalisasi nilai
Diberi array nilai [70, 85, 90, 60, 95]. Dengan vectorization (tanpa loop), ubah ke skala 0-100 relatif terhadap nilai max: nilai / max * 100. Print hasilnya dan rata-ratanya.