6.9. Fungsi universal¶
Sebuah fungsi universal (ufunc) adalah fungsi matematika yang berlaku untuk setiap elemen array dalam satu panggilan. Operator aritmetika pada halaman sebelumnya adalah fungsi universal dengan sintaks operator; halaman ini adalah katalog dari yang bernama yang mencakup trigonometri, exp / log, pembulatan, dan beberapa lainnya.
Setiap ufunc menerima skalar, Python iterable, atau ndarray, dan mengembalikan satu float (ketika inputnya skalar) atau ndarray float:
from ulab import numpy as np
np.exp(2.0) # 7.389...
np.sin(range(4)) # 1-D float ndarray
np.sqrt([1, 4, 9, 16]) # array([1.0, 2.0, 3.0, 4.0])
a = np.arange(9).reshape((3, 3))
np.exp(a) # 3x3 float ndarray
6.9.1. Katalog¶
numpy mengekspos fungsi matematika yang paling sering dibutuhkan aplikasi tertanam:
Trigonometri --
sin(),cos(),tan(),asin(),acos(),atan(),arctan2(),sinh(),cosh(),tanh(),asinh(),acosh(),atanh(),sinc().Eksponen dan logaritma --
exp(),expm1(),log(),log10(),log2(),sqrt().
Setiap fungsi memproses seluruh array dalam satu panggilan library. Peningkatan kecepatan dibanding list comprehension Python yang memanggil math.sin() elemen per elemen adalah 10-30x pada buffer yang umum.
6.9.2. Kata kunci out=¶
Setiap panggilan ufunc biasanya mengalokasikan array hasil baru untuk menampung outputnya. Dalam loop yang berjalan berkali-kali per detik, alokasi tersebut bertambah dan membuang RAM. Meneruskan out= -- array float yang sudah ada, dengan bentuk yang sama dengan input -- menulis hasil ke dalam array tersebut alih-alih mengalokasikan yang baru:
x = np.linspace(0, 2 * np.pi, num=256)
y = np.zeros(256)
while True:
np.sin(x, out=y)
# use y ...
Jika out memiliki dtype atau bentuk yang salah, fungsi akan melempar pengecualian. Kata kunci ini didukung pada setiap ufunc di halaman ini; ini adalah cara paling bersih untuk menjaga loop pemrosesan sinyal streaming bebas alokasi.
6.9.3. Ufunc dua argumen¶
arctan2() adalah satu-satunya ufunc dua argumen sejati dalam daftar di atas -- ia mengembalikan arctangen yang sadar-kuadran dari y / x dan mem-broadcast dua operand:
y = np.array([1, 2.2, 33.33, 444.444])
np.arctan2(y, 1.0) # against a scalar
np.arctan2(1.0, y) # the other way
np.arctan2(y, y) # against another array
6.9.4. Menyusun fungsi universal¶
Fungsi universal dapat disusun seperti ekspresi array lainnya. Beberapa pola yang sering muncul pada kamera:
Koreksi gamma (dalam ruang float)
gamma = 0.5
out = 255.0 * (frame / 255.0) ** gamma
Pemulusan low-pass sederhana (alpha mendekati 1.0 berarti pembaruan lambat):
alpha = 0.95
filtered = alpha * filtered + (1.0 - alpha) * sample
Sigmoid
sigmoid = 1.0 / (1.0 + np.exp(-x))
Spektrum daya dalam dB
spectrum = 20.0 * np.log10(np.abs(real) + 1e-12)
6.9.5. np.vectorize¶
Fungsi Python biasa dapat ditingkatkan menjadi fungsi berbentuk ufunc menggunakan vectorize(). Callable yang dihasilkan menerima skalar, iterable, atau nilai ndarray
def f(x):
return x * x
vf = np.vectorize(f)
vf(44.0) # array([1936.0])
vf(np.array([1, 2, 3, 4])) # array([1.0, 4.0, 9.0, 16.0])
vf([2, 3, 4]) # array([4.0, 9.0, 16.0])
Secara default dtype hasil adalah float. otypes= menggantikannya:
vf_u8 = np.vectorize(f, otypes=np.uint8)
vf_u8([1, 2, 3, 4])
# array([1, 4, 9, 16], dtype=uint8)
Fungsi Python harus menerima satu argumen dan mengembalikan satu angka.
vectorize() sebagian besar bersifat sintaksis -- fungsi Python yang dibungkus masih harus berjalan sekali per elemen, sehingga sebagian besar biaya interpreter per-elemen yang dihindari ufunc sejati kembali lagi. Harapkan percepatan sederhana 30%-50% dibanding list comprehension, bukan 30x dari fungsi universal sejati. Alat yang tepat ketika satu fungsi harus bekerja pada skalar, list, dan array dengan nama yang sama -- bukan ketika kecepatan mentah adalah tujuannya.
Untuk tanda tangan panggilan lengkap dari setiap fungsi universal yang tercantum di atas, lihat numpy --- operasi array yang kompatibel dengan numpy.