Section ini telah membangun kemampuan broadcasting; sekarang kita naik satu tingkat ke cara berpikir yang memanfaatkannya secara penuh: vectorization. Vectorization adalah gaya penulisan kode yang menyatakan operasi untuk seluruh array sekaligus — tanpa loop eksplisit dan tanpa indeks manual. Iterasi tetap terjadi, tetapi dilakukan oleh kode C di dalam NumPy, bukan oleh interpreter Python.
Perbedaannya bukan sekadar gaya. Ekspresi yang menyebut array utuh lebih ringkas, lebih sedikit menyimpan peluang salah indeks, dan berjalan jauh lebih cepat — bab Loop Python vs Vectorization akan mengukurnya dengan angka.
Bab ini menunjukkan:
- Persamaan hasil antara loop bersarang dan operasi ter-vektorisasi.
- Rumus yang berlaku untuk seluruh array dua dimensi dalam satu baris.
- Operasi NumPy lain yang ikut ter-vektorisasi secara bawaan.
Dua cara, satu hasil #
Tugasnya: menghitung total penjualan per cabang dari matriks (3, 3) — tiga cabang, tiga hari. Pertama dengan loop bersarang, lalu dengan sum(axis=1):
import numpy as np
penjualan = np.array([[10, 12, 9],
[8, 11, 13],
[15, 7, 6]], dtype=float)
total_loop = []
for i in range(penjualan.shape[0]):
total = 0
for j in range(penjualan.shape[1]):
total = total + penjualan[i, j]
total_loop.append(total)
total_vektor = penjualan.sum(axis=1)
print(np.array_equal(total_loop, total_vektor))
print(total_vektor)Output yang Dihasilkan:
True
[31. 32. 28.]- Baris 3-5 (
penjualan): matriks penjualan; baris untuk cabang, kolom untuk hari, satuan juta rupiah. - Baris 7-11 (loop bersarang): loop luar berjalan per cabang, loop dalam menjumlahkan tiga hari, dan hasil tiap cabang ditampung dalam list.
- Baris 13 (
penjualan.sum(axis=1)): satu panggilan method meratakan axis 1 (kolom hari) dan menghasilkan total per cabang sekaligus. - Baris 15 (
np.array_equal):Truemembuktikan kedua pendekatan menghasilkan nilai yang persis sama — vectorization bukan mengubah hasil, melainkan cara menyatakannya.
Rumus untuk seluruh array #
Konversi suhu dari Celsius ke Fahrenheit berlaku seragam pada tiap elemen. Dengan vectorization, rumus ditulis satu kali untuk matriks utuh:
import numpy as np
suhu_c = np.array([[27.5, 28.1, 30.2],
[24.9, 25.3, 26.7]])
suhu_f = suhu_c * 9 / 5 + 32
print(suhu_f)Output yang Dihasilkan:
[[81.5 82.58 86.36]
[76.82 77.54 80.06]]- Baris 5 (
suhu_c * 9 / 5 + 32): interpreter mengeksekusi tiga operasi array berurutan — perkalian, pembagian, penjumlahan — dan tiap operasi memproses seluruh enam elemen tanpa satu pun indeks. - Baris 7: hasil mempertahankan bentuk
(2, 3); rumus yang sama juga sah untuk array 1-D maupun 3-D tanpa perubahan satu karakter pun.
Perhatikan bahwa tidak ada konsep “per baris” atau “per elemen” dalam kodenya. Maksud yang kita tulis adalah rumus untuk array utuh; penerapan per elemen menjadi urusan NumPy.
Operasi lain yang ikut ter-vektorisasi #
Vectorization bukan milik operator aritmetika saja. Fungsi matematika NumPy dan perbandingan pun bekerja pada array utuh:
import numpy as np
penjualan = np.array([[10, 12, 9],
[8, 11, 13]], dtype=float)
print(np.sqrt(penjualan[0]))
print(penjualan > 10)Output yang Dihasilkan:
[3.16227766 3.46410162 3. ]
[[False True False]
[False True True]]- Baris 6 (
np.sqrt): akar kuadrat diterapkan pada seluruh baris pertama dalam satu panggilan — fungsi semacam ini disebut ufunc dan selalu ter-vektorisasi. - Baris 7 (
penjualan > 10): perbandingan menghasilkan array boolean(2, 3); nilaiTruemenandai elemen yang memenuhi syarat. Array boolean ini menjadi bahan utama bab Conditional Ter-vektorisasi.
| Aspek | Loop eksplisit | Vectorization |
|---|---|---|
| Bentuk kode | indeks manual, beberapa baris per operasi | satu ekspresi per operasi |
| Sumber kesalahan | indeks terbalik, batas loop meleset | jauh lebih sedikit titik rawan |
| Letak iterasi | interpreter Python | kode C di dalam NumPy |
| Keterbacaan maksud | harus dilacak baris demi baris | terbaca langsung dari ekspresi |