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
+memanggilnp.add. - Tiga metode bawaan ufunc:
reduce,accumulate, danouter. - Parameter
outuntuk 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:
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:
<class 'numpy.ndarray'>
<class 'numpy.ufunc'>
[11 22 33]
True- Baris 5 (
type(a + b)): hasil operasi adalahnumpy.ndarray— array baru yang menampung hasil. - Baris 6 (
type(np.add)):np.addbukan fungsi biasa; objeknya adalah turunan kelasnumpy.ufunc. Ketika kita menulisa + b, NumPy memanggil ufuncnp.adddi balik layar. - Baris 7 (
np.add(a, b)): memanggil ufunc secara langsung memberi hasil yang sama persis:[11 22 33]. - Baris 8:
np.array_equalmenegaskan kedua jalur menghasilkan array yang identik.
Pemetaan operator ke ufunc-nya kini bisa kita susun:
| Operator | Ufunc setara | Keterangan |
|---|---|---|
a + b | np.add(a, b) | penjumlahan |
a - b | np.subtract(a, b) | pengurangan |
a * b | np.multiply(a, b) | perkalian |
a / b | np.divide(a, b) | pembagian |
a ** b | np.power(a, b) | pangkat |
-a | np.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:
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:
10
[ 1 3 6 10]
[[11 21 31]
[12 22 32]]- Baris 4 (
np.add.reduce(a)):reducemelipat seluruh elemen dengan satu operasi —1+2+3+4menjadi10. Fungsinp.sumpada Chapter sum dan prod dibangun di atas mekanisme yang sama. - Baris 5 (
np.add.accumulate(a)):accumulatemenyimpan hasil parsial di setiap posisi, menghasilkan total berjalan[1 3 6 10]— inilah intinp.cumsum. - Baris 6 (
np.add.outer(u, v)):outermenghitung semua pasangan antar kedua array; baris pertama adalah1+10,1+20,1+30dan baris kedua adalah2+10,2+20,2+30.
| Metode | Hasil pada np.add | Keterangan |
|---|---|---|
reduce | 10 | satu nilai: seluruh elemen dilipat |
accumulate | [1 3 6 10] | total berjalan per posisi |
outer | matriks 2 x 3 | semua 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:
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:
sebelum : [0. 0. 0.]
sesudah : [11. 22. 33.]- Baris 5 (
hasil = np.zeros(3)): wadah hasil disiapkan lebih dahulu dengan bentuk dan dtype yang sesuai. - Baris 7 (
np.add(a, b, out=hasil)): ufunc menulis langsung ke buffer milikhasil; tidak ada alokasi array baru untuk hasil. Inilah alasannp.adddipanggil eksplisit — operator+tidak bisa membawa parameter tambahan. - Baris 8:
hasilkini berisi[11. 22. 33.]dengan identitas array yang sama seperti sebelum dipanggil.