Idenya
List Python adalah wadah serbaguna yang luar biasa: bisa menampung apa saja, bisa membesar dan mengecil, dan bisa mencampur tipe. Tapi list tidak dibuat untuk matematika pada banyak angka. Coba gandakan setiap harga di sebuah list:
prices = [185, 320, 95, 65, 110] # ribu Rupiah
print(prices * 2)
[185, 320, 95, 65, 110, 185, 320, 95, 65, 110]
Itu bukan menggandakan, itu mengulang list-nya. Untuk menggandakan nilainya, kamu butuh loop:
doubled = [p * 2 for p in prices]
print(doubled)
[370, 640, 190, 130, 220]
NumPy (Numerical Python) menambahkan struktur data baru, yaitu array, di mana matematika bekerja seperti yang kamu harapkan: pada setiap elemen sekaligus.
import numpy as np
prices = np.array([185, 320, 95, 65, 110])
print(prices * 2)
[370 640 190 130 220]
Tanpa loop. import numpy as np adalah konvensi universal: setiap tutorial, rekan kerja dan library memakai nama pendek np.
List itu seperti kantong belanja: apa saja muat, tapi kamu mengeluarkan barangnya satu per satu. Array itu seperti wadah telur: setiap slot berisi jenis barang yang sama, dalam grid yang tetap, sehingga kamu bisa menangani seluruh wadah sekaligus.
Matematika pada seluruh array
Sekarang alasan sebenarnya array ada. Misalkan kamu punya harga setiap produk di satu array dan jumlah terjual masing-masing di array lain, dengan urutan yang sama. Revenue per produk adalah harga dikali unit, untuk setiap produk. Dengan array, operator biasa bekerja elemen demi elemen, jadi kamu bisa menulisnya persis seperti itu:
units = np.array([3, 1, 4, 2, 5])
revenue = prices * units # 185*3, 320*1, 95*4, ...
print(revenue)
print(revenue.sum())
[555 320 380 130 550]
1935
Elemen pertama prices dikalikan dengan elemen pertama units, yang kedua dengan yang kedua, dan seterusnya. Dengan list kamu butuh zip dan loop; dengan array cukup satu baris yang terbaca seperti rumus di kertas: revenue = harga × unit.
Perbandingan juga bekerja elemen demi elemen, menghasilkan True/False untuk setiap nilai:
print(prices > 100)
[ True True False False True]
Kamu akan memakai "mask" ini untuk memfilter data di modul selanjutnya.
Kenapa array cepat
Kode yang lebih pendek memang menyenangkan, tapi keuntungan yang lebih besar adalah kecepatan. Untuk beberapa angka kamu tidak akan merasakannya, tapi analyst sering bekerja dengan jutaan angka. Ini pekerjaan yang sama, mengkuadratkan sejuta angka, dikerjakan sekali dengan list dan sekali dengan array, dengan pengukur waktu di masing-masing:
import time
numbers = list(range(1_000_000))
start = time.perf_counter()
squares = [n * n for n in numbers]
list_time = time.perf_counter() - start
array = np.arange(1_000_000)
start = time.perf_counter()
squares = array * array
array_time = time.perf_counter() - start
print(f"list: {list_time * 1000:.1f} ms")
print(f"array: {array_time * 1000:.1f} ms")
list: 48.3 ms
array: 1.2 ms
Angkamu akan berbeda (dan browser lebih lambat daripada laptop), tapi array biasanya 10 sampai 100 kali lebih cepat. Kenapa?
- Satu tipe, dikemas rapat. List menyimpan pointer ke objek-objek Python terpisah yang tersebar di memori. Array menyimpan angka mentah bersebelahan, seperti kolom di spreadsheet.
- Loop-nya berjalan di C.
array * arraytetap melakukan loop atas sejuta angka, tapi di dalam kode C NumPy yang terkompilasi, bukan Python, sehingga melewati semua overhead per elemen dari interpreter Python.
Gaya menulis operasi pada seluruh array alih-alih loop Python ini disebut vektorisasi (vectorization), dan itulah keterampilan inti dari track ini.
Satu tipe per array
Karena array dikemas rapat, setiap elemen harus punya tipe yang sama. Campur integer dan float, dan NumPy mengubah semuanya ke tipe yang bisa menampung semuanya:
print(np.array([1, 2, 3.5]))
print(np.array([1, 2, "three"]))
[1. 2. 3.5]
['1' '2' 'three']
Yang pertama menjadi float semua (1. berarti 1.0). Yang kedua mengubah setiap angka menjadi teks, yang jarang sekali kamu inginkan. Kalau array-mu ternyata penuh string, periksa data input-mu.
Di mana kamu akan bertemu NumPy
Bahkan kalau kamu jarang menulis import numpy sendiri, kamu terus memakainya:
- pandas menyimpan setiap kolom sebagai array NumPy.
df["price"].to_numpy()memberimu array di baliknya. - scikit-learn menerima dan mengembalikan array NumPy.
- Tensor PyTorch adalah array NumPy dengan kekuatan tambahan (GPU, gradien), dan bisa dikonversi bolak-balik dengan satu pemanggilan.
- Plotly menerima array untuk setiap sumbu.
Memahami array berarti memahami apa yang dilakukan semua library itu di balik layar.
Mengapa ini penting untuk kode yang bersih
revenue = prices * units lebih pendek dari loop, tapi yang lebih penting, ia terbaca seperti aturan bisnisnya. Tidak ada variabel index yang bisa salah, tidak ada list yang harus di-append, tidak ada kesalahan off-by-one. Kode tervektorisasi biasanya lebih cepat, lebih pendek dan lebih jelas sekaligus, hal yang jarang terjadi dalam pemrograman.
Rangkuman
import numpy as np; buat array dengannp.array([...]).- Aritmetika dan perbandingan pada array bekerja elemen demi elemen; pada list,
*mengulang. - Array menampung satu tipe dan dikemas rapat di memori, sehingga operasinya berjalan di kode C yang cepat.
- Menulis operasi pada seluruh array alih-alih loop disebut vektorisasi.
- pandas, scikit-learn dan PyTorch semuanya dibangun di atas array NumPy.