6.9. Univerzalne funkcije¶
Univerzalna funkcija (ufunc) je matematička funkcija koja se primjenjuje na svaki element polja u jednom pozivu. Aritmetički operatori s prethodne stranice univerzalne su funkcije u ruhu sintakse operatora; ova stranica je katalog imenovanih funkcija koje pokrivaju trigonometriju, exp / log, zaokruživanje i nekoliko drugih.
Svaka ufunc prihvaća skalar, Python iterabilni objekt ili ndarray, i vraća ili jedan float (kada je ulaz bio skalar) ili float ndarray
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 izlaže matematičke funkcije za kojima ugrađena aplikacija najčešće poseže:
Trigonometrija –
sin(),cos(),tan(),asin(),acos(),atan(),arctan2(),sinh(),cosh(),tanh(),asinh(),acosh(),atanh(),sinc().Eksponencijali i logaritmi –
exp(),expm1(),log(),log10(),log2(),sqrt().
Svaka funkcija obrađuje cijelo polje u jednom pozivu biblioteke. Ubrzanje u odnosu na Python list comprehension koji poziva math.sin() element po element iznosi 10-30x na tipičnom međuspremniku.
6.9.2. Ključna riječ out=¶
Svaki poziv ufunc obično alocira svježe rezultatsko polje za svoj izlaz. U petlji koja se izvodi mnogo puta u sekundi, te se alokacije nakupljaju i troše RAM. Prosljeđivanje out= – float polja koje već postoji, istog oblika kao ulaz – upisuje rezultat u to polje umjesto alociranja novog:
x = np.linspace(0, 2 * np.pi, num=256)
y = np.zeros(256)
while True:
np.sin(x, out=y)
# use y ...
Ako out ima pogrešan dtype ili oblik, funkcija baca iznimku. Ključna riječ podržana je na svakoj ufunc na ovoj stranici; to je najčišći način da streaming petlja obrade signala ostane bez alokacija.
6.9.3. Ufunc s dva argumenta¶
arctan2() je jedina prava ufunc s dva argumenta u gornjem popisu – vraća arkus tangens svjestan kvadranta od y / x i proširuje (broadcast) dva operanda:
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. Slaganje univerzalnih funkcija¶
Univerzalne funkcije slažu se kao i svaki drugi izraz s poljima. Nekoliko obrazaca koji se pojavljuju na kameri:
Gama korekcija (u float prostoru)
gamma = 0.5
out = 255.0 * (frame / 255.0) ** gamma
Jednostavan niskopropusni izglađivač (alpha blizu 1.0 znači sporo ažuriranje):
alpha = 0.95
filtered = alpha * filtered + (1.0 - alpha) * sample
Sigmoida
sigmoid = 1.0 / (1.0 + np.exp(-x))
Spektar snage u dB
spectrum = 20.0 * np.log10(np.abs(real) + 1e-12)
6.9.5. np.vectorize¶
Obična Python funkcija može se unaprijediti u funkciju oblika ufunc pomoću vectorize(). Rezultatski pozivni objekt prihvaća skalare, iterabilne objekte ili ndarray vrijednosti:
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])
Prema zadanom, dtype rezultata je float. otypes= to nadjačava:
vf_u8 = np.vectorize(f, otypes=np.uint8)
vf_u8([1, 2, 3, 4])
# array([1, 4, 9, 16], dtype=uint8)
Python funkcija mora uzeti jedan argument i vratiti jedan broj.
vectorize() je uglavnom sintaktička – omotana Python funkcija i dalje se mora izvesti jednom po elementu, pa se većina troška interpretera po elementu koji prava ufunc izbjegava vraća. Očekujte skromno ubrzanje od 30%-50% u odnosu na list comprehension, a ne 30x prave univerzalne funkcije. Pravi alat kada jedna funkcija mora raditi na skalarima, listama i poljima pod istim imenom – a ne kada je cilj sirova brzina.
Za pune potpise poziva svake gore navedene univerzalne funkcije, pogledajte numpy — numpy-kompatibilne operacije nad poljima.