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):

python
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:

text
True
[31. 32. 28.]
  1. Baris 3-5 (penjualan): matriks penjualan; baris untuk cabang, kolom untuk hari, satuan juta rupiah.
  2. Baris 7-11 (loop bersarang): loop luar berjalan per cabang, loop dalam menjumlahkan tiga hari, dan hasil tiap cabang ditampung dalam list.
  3. Baris 13 (penjualan.sum(axis=1)): satu panggilan method meratakan axis 1 (kolom hari) dan menghasilkan total per cabang sekaligus.
  4. Baris 15 (np.array_equal): True membuktikan 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:

python
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:

text
[[81.5  82.58 86.36]
 [76.82 77.54 80.06]]
  1. 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.
  2. 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:

python
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:

text
[3.16227766 3.46410162 3.        ]
[[False  True False]
 [False  True  True]]
  1. Baris 6 (np.sqrt): akar kuadrat diterapkan pada seluruh baris pertama dalam satu panggilan — fungsi semacam ini disebut ufunc dan selalu ter-vektorisasi.
  2. Baris 7 (penjualan > 10): perbandingan menghasilkan array boolean (2, 3); nilai True menandai elemen yang memenuhi syarat. Array boolean ini menjadi bahan utama bab Conditional Ter-vektorisasi.
AspekLoop eksplisitVectorization
Bentuk kodeindeks manual, beberapa baris per operasisatu ekspresi per operasi
Sumber kesalahanindeks terbalik, batas loop melesetjauh lebih sedikit titik rawan
Letak iterasiinterpreter Pythonkode C di dalam NumPy
Keterbacaan maksudharus dilacak baris demi baristerbaca langsung dari ekspresi