6.16. Käyrät ja integrointi¶
Matematiikkasivut kattoivat operaatiot, jotka ottavat taulukon sisään ja tuottavat taulukon (tai skalaarin) ulos – aritmetiikkaa, pelkistyksiä, lähetystä (broadcasting). Tämä sivu kattaa erilaisen operaatioluokan: sellaiset, jotka käsittelevät taulukkoa näytteistettynä funktiona ja esittävät kysymyksiä itse funktiosta. Näytteiden välistä interpolointia, käyrän sovittamista niihin, niiden alle integrointia, niiden konvolvointia toisen puskurin kanssa.
Kaikki nämä hyväksyvät ndarray-syötteitä ja palauttavat joko liukulukuskalaarin tai liukuluku-ndarray-olion.
6.16.1. Interpolointi¶
interp() tekee yksiulotteista lineaarista interpolointia. xp on monotonisesti kasvava 1-ulotteinen taulukko riippumattomia arvoja; fp on vastaavat riippuvat arvot; x on se, missä interpolantti tulisi laskea:
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])
Alueen [xp[0], xp[-1]] ulkopuolella tulos leikataan vastaavasti arvoihin fp[0] ja fp[-1]; avainsanat left= ja right= ohittavat nämä päätepisteet.
Käytetään kameralla kalibrointitaulukon uudelleenkartoittamiseen mielivaltaisiin näytepisteisiin – termistorin lämpötila-jännite-taulukko, epälineaarinen pikselivastekäyrä, kanavakohtainen gammahaku. Yksi kirjastokutsu, yksi läpikäynti syötteistä, ei Python-silmukkaa.
6.16.2. Polynomin sovitus ja arviointi¶
polyfit() sovittaa asteen deg polynomin datapisteisiin (x, y) pienimmän neliösumman menetelmällä ja palauttaa kertoimet (korkein aste ensin):
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)
Kun x jätetään pois, käytetään range(len(y)) – hyödyllinen nopean polynomin sovittamiseen säännöllisesti näytteistettyyn puskuriin ilman siihen liittyvää x-akselia:
np.polyfit(y, 2)
polyval() arvioi polynomin, jonka kertoimet ovat p, pisteessä x. Syöte x voi olla skalaari (palauttaa liukuluvun) tai ndarray (palauttaa ndarray-olion):
p = np.polyfit(x, y, 2)
fitted = np.polyval(p, x)
Luonteva pari on kutsua polyfit kerran kalibrointiaikana, tallentaa kertoimet ja kutsua polyval arvioimaan tuloksena saatu käyrä joka kehyksellä. Polynomin arviointivaihe on kourallinen liukulukuoperaatioita näytettä kohden, mikä on edullista pienimmilläkin kameroilla.
6.16.3. Konvoluutio¶
convolve() palauttaa kahden 1-ulotteisen taulukon täyspituisen diskreetin lineaarisen konvoluution. Vain full-tila on toteutettu; tulosteen pituus on len(a) + len(v) - 1. Viipaloi tulos saadaksesi saman vaikutuksen kuin työpöytä-numpy-versiossa tarjotuilla same- ja valid-tiloilla:
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])
Hyödyllinen lyhyille FIR-suodattimille ja tasoituskerneleille (laatikko, kolmio, gaussinen), joissa SOS-ketjun pystyttäminen olisi liioiteltua. Ajoaika on verrannollinen kahden taulukon pituuden tuloon – sopiva lyhyille kerneleille, mutta muuttuu nopeasti kalliimmaksi kuin FFT-konvoluutio pitkille kerneleille.
6.16.4. Puolisuunnikasintegrointi¶
trapz() integroi näytteistetyn funktion yhdistetyllä puolisuunnikassäännöllä:
x = np.linspace(0, np.pi, num=128)
y = np.sin(x)
np.trapz(y, x) # ~ 2.0
Anna dx=, kun näytevälit ovat tasaiset ja vain askel merkitsee; anna x=, kun näytteet eivät ole tasavälein. Oikea kutsu jo kaapatun sensoridatan integrointiin, kun analyyttistä muotoa ei ole saatavilla.
Näytedatalle, joka on ollut kaistarajoitettua (esimerkiksi äänipuskuri laskostumisenestosuodattimen jälkeen), puolisuunnikassääntö suppenee näytemäärän neliön mukaan, mikä tarkoittaa, että puskurin pituuden kaksinkertaistaminen pienentää virhettä neljäsosaan.
Kun integroitava ei ole näytepuskuri vaan Python-funktio, jonka sovellus voi arvioida mielivaltaisissa pisteissä, oikea valinta on eri ratkaisijaperhe.