6.16. Görbék és integrálás¶
A matematikai oldalak olyan műveleteket tárgyaltak, amelyek egy tömböt vesznek be, és egy tömböt (vagy skalárt) adnak ki – aritmetika, redukciók, broadcasting. Ez az oldal a műveletek egy másik osztályát tárgyalja: olyanokat, amelyek a tömböt mintavételezett függvényként kezelik, és magáról a függvényről tesznek fel kérdéseket. Minták közötti interpolálás, görbe illesztése rájuk, alattuk lévő terület integrálása, egy másik pufferrel való konvolúciójuk.
Mindezek ndarray bemeneteket fogadnak el, és vagy egy lebegőpontos skalárt, vagy egy lebegőpontos ndarray tömböt adnak vissza.
6.16.1. Interpoláció¶
A interp() egydimenziós lineáris interpolációt végez. Az xp a független értékek monoton növekvő 1 dimenziós tömbje; az fp a hozzájuk tartozó függő értékek; az x az, ahol az interpolánst ki kell értékelni:
xp = np.array([0.0, 1.0, 2.0, 3.0])
fp = np.array([10.0, 20.0, 25.0, 30.0])
x = np.array([0.5, 1.5, 2.5])
np.interp(x, xp, fp)
# array([15.0, 22.5, 27.5])
Az [xp[0], xp[-1]] tartományon kívül az eredmény rendre fp[0] és fp[-1] értékre vágódik; a left= és right= kulcsszavak felülírják ezeket a végpontokat.
A kamerán egy kalibrációs tábla tetszőleges mintapozíciókra való átképezésére használatos – egy termisztor hőmérséklet-feszültség táblája, egy nemlineáris képpontválasz-görbe, egy csatornánkénti gamma keresőtábla. Egy könyvtárhívás, egy menet a bemeneteken, nincs Python ciklus.
6.16.2. Polinomillesztés és kiértékelés¶
A polyfit() legkisebb négyzetek módszerével illeszt egy deg fokszámú polinomot az (x, y) adatpontokra, és visszaadja az együtthatókat (a legmagasabb fokszámmal kezdve):
x = np.array([0.0, 1.0, 2.0, 3.0, 4.0])
y = np.array([0.0, 1.1, 3.9, 9.1, 15.8])
coeffs = np.polyfit(x, y, 2)
# array([1.0, 0.0, 0.0]) (approximately)
Amikor az x el van hagyva, a range(len(y)) használatos – hasznos egy gyors polinom illesztéséhez egy egyenletesen mintavételezett pufferhez, amelyhez nem tartozik x-tengely:
np.polyfit(y, 2)
A polyval() kiértékeli az x helyen azt a polinomot, amelynek együtthatói p. Az x bemenet lehet skalár (ekkor lebegőpontos számot ad vissza) vagy ndarray (ekkor ndarray tömböt ad vissza):
p = np.polyfit(x, y, 2)
fitted = np.polyval(p, x)
A természetes párosítás az, ha a polyfit függvényt egyszer hívod meg a kalibráció idején, eltárolod az együtthatókat, és minden képkockánál meghívod a polyval függvényt a kapott görbe kiértékeléséhez. A polinom-kiértékelési lépés mintánként néhány lebegőpontos művelet, ami még a legkisebb kamerákon is olcsó.
6.16.3. Konvolúció¶
A convolve() két 1 dimenziós tömb teljes hosszúságú diszkrét lineáris konvolúcióját adja vissza. Csak a full mód van megvalósítva; a kimenet hossza len(a) + len(v) - 1. Szeleteld fel az eredményt ugyanazon hatás eléréséhez, mint amit az asztali numpy által kínált same és valid mód nyújt:
a = np.array([1.0, 2.0, 3.0])
v = np.array([0.5, 0.5])
np.convolve(a, v)
# array([0.5, 1.5, 2.5, 1.5])
Hasznos rövid FIR szűrőkhöz és simítómagvakhoz (négyszög, háromszög, gauss), ahol egy SOS lánc felépítése túlzás lenne. A futásidő a két tömbhossz szorzatával arányos – rövid magokhoz megfelelő, de hosszúakhoz gyorsan drágábbá válik egy FFT-konvolúciónál.
6.16.4. Trapéz integrálás¶
A trapz() egy mintavételezett függvényt integrál az összetett trapézszabállyal:
x = np.linspace(0, np.pi, num=128)
y = np.sin(x)
np.trapz(y, x) # ~ 2.0
Add meg a dx= kulcsszót, ha a minták távolsága egyenletes, és csak a lépés számít; add meg az x= kulcsszót, ha a minták nem egyenletesen helyezkednek el. A megfelelő hívás már rögzített érzékelőadatok integrálásához, ahol az analitikus alak nem áll rendelkezésre.
Olyan mintaadatoknál, amelyek sávkorlátozottak (például egy hangpuffer egy átlapolásgátló szűrő után), a trapézszabály a mintaszám négyzetével konvergál, ami azt jelenti, hogy a puffer hosszának megduplázása a hibát a negyedére csökkenti.
Amikor az integrandus nem minták puffere, hanem egy Python függvény, amelyet az alkalmazás tetszőleges pontokban ki tud értékelni, a megoldók egy másik családja a megfelelő választás.