DataLens

Kenapa NumPy: array vs list Python

Kenalan dengan array, struktur data di balik pandas dan machine learning, dan lihat kenapa ia lebih unggul daripada list untuk angka.

Level: Dasar · 7 menit baca

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

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.

Analogi

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?

  1. 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.
  2. Loop-nya berjalan di C. array * array tetap 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:

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

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Berikutnya: Membuat array (array, arange, zeros, ones, linspace) →