Sampai bab ini kita menulis a + b dan menerima hasilnya begitu saja. Pertanyaan yang wajar muncul: fungsi apa yang sesungguhnya dijalankan NumPy ketika operator + bertemu dua array? Jawabannya adalah ufunc — singkatan dari universal function, fungsi yang bekerja elemen demi elemen pada ndarray, ditulis dalam C, dan dibekali kemampuan bawaan: broadcasting antar bentuk, konversi dtype, serta penulisan hasil ke array yang sudah ada. Semua operator aritmetika dan perbandingan yang kita pakai selama ini hanyalah pintasan untuk memanggil ufunc.

Agenda bab:

  • Membuktikan bahwa operator + memanggil np.add.
  • Tiga metode bawaan ufunc: reduce, accumulate, dan outer.
  • Parameter out untuk menulis hasil ke array yang telah disiapkan.

Operator hanyalah pintasan #

Kita periksa tipe objek di kedua sisi: hasil a + b dan fungsi np.add itu sendiri:

python
import numpy as np

a = np.array([1, 2, 3])
b = np.array([10, 20, 30])
print(type(a + b))
print(type(np.add))
print(np.add(a, b))
print(np.array_equal(np.add(a, b), a + b))

Output yang Dihasilkan:

text
<class 'numpy.ndarray'>
<class 'numpy.ufunc'>
[11 22 33]
True
  1. Baris 5 (type(a + b)): hasil operasi adalah numpy.ndarray — array baru yang menampung hasil.
  2. Baris 6 (type(np.add)): np.add bukan fungsi biasa; objeknya adalah turunan kelas numpy.ufunc. Ketika kita menulis a + b, NumPy memanggil ufunc np.add di balik layar.
  3. Baris 7 (np.add(a, b)): memanggil ufunc secara langsung memberi hasil yang sama persis: [11 22 33].
  4. Baris 8: np.array_equal menegaskan kedua jalur menghasilkan array yang identik.

Pemetaan operator ke ufunc-nya kini bisa kita susun:

OperatorUfunc setaraKeterangan
a + bnp.add(a, b)penjumlahan
a - bnp.subtract(a, b)pengurangan
a * bnp.multiply(a, b)perkalian
a / bnp.divide(a, b)pembagian
a ** bnp.power(a, b)pangkat
-anp.negative(a)pembalikan tanda

Pemetaan lengkap beserta bukti kesetaraannya dibahas pada Chapter Operator dan Fungsi NumPy. Selain aritmetika, ufunc juga mencakup perbandingan (np.greater, np.equal) dan fungsi matematika (np.exp, np.sqrt) — semua fungsi di Chapter Operasi Matematika adalah ufunc.

Metode reduce, accumulate, dan outer #

Setiap ufunc membawa metode bawaan yang memanfaatkan sifat elemen demi elemennya. Kita coba ketiganya pada np.add:

python
import numpy as np

a = np.array([1, 2, 3, 4])
print(np.add.reduce(a))
print(np.add.accumulate(a))
print(np.add.outer(np.array([1, 2]), np.array([10, 20, 30])))

Output yang Dihasilkan:

text
10
[ 1  3  6 10]
[[11 21 31]
 [12 22 32]]
  1. Baris 4 (np.add.reduce(a)): reduce melipat seluruh elemen dengan satu operasi — 1+2+3+4 menjadi 10. Fungsi np.sum pada Chapter sum dan prod dibangun di atas mekanisme yang sama.
  2. Baris 5 (np.add.accumulate(a)): accumulate menyimpan hasil parsial di setiap posisi, menghasilkan total berjalan [1 3 6 10] — inilah inti np.cumsum.
  3. Baris 6 (np.add.outer(u, v)): outer menghitung semua pasangan antar kedua array; baris pertama adalah 1+10, 1+20, 1+30 dan baris kedua adalah 2+10, 2+20, 2+30.
MetodeHasil pada np.addKeterangan
reduce10satu nilai: seluruh elemen dilipat
accumulate[1 3 6 10]total berjalan per posisi
outermatriks 2 x 3semua pasangan antar dua array

Parameter out: menulis hasil ke array yang tersedia #

Secara bawaan setiap ufunc mengalokasikan array baru untuk hasilnya. Parameter out mengalihkan hasil ke array yang kita siapkan lebih dahulu — array itu yang diisi, bukan array baru:

python
import numpy as np

a = np.array([1.0, 2.0, 3.0])
b = np.array([10.0, 20.0, 30.0])
hasil = np.zeros(3)
print("sebelum :", hasil)
np.add(a, b, out=hasil)
print("sesudah :", hasil)

Output yang Dihasilkan:

text
sebelum : [0. 0. 0.]
sesudah : [11. 22. 33.]
  1. Baris 5 (hasil = np.zeros(3)): wadah hasil disiapkan lebih dahulu dengan bentuk dan dtype yang sesuai.
  2. Baris 7 (np.add(a, b, out=hasil)): ufunc menulis langsung ke buffer milik hasil; tidak ada alokasi array baru untuk hasil. Inilah alasan np.add dipanggil eksplisit — operator + tidak bisa membawa parameter tambahan.
  3. Baris 8: hasil kini berisi [11. 22. 33.] dengan identitas array yang sama seperti sebelum dipanggil.