SciPy OPAS. Matti Pastell. matti.pastell@helsinki.fi Maataloustieteiden laitos, Helsingin yliopisto. 12. tammikuuta 2010.



Samankaltaiset tiedostot
MATLAB OPAS. Matti Pastell. Maataloustieteiden laitos, Helsingin Yliopisto. 11. tammikuuta 2010

Harjoitus 1: Matlab. Harjoitus 1: Matlab. Mat Sovelletun matematiikan tietokonetyöt 1. Syksy 2006

Zeon PDF Driver Trial

Matlabin perusteita Grafiikka

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

Valitse ruudun yläosassa oleva painike Download Scilab.

Tässä dokumentissa on ensimmäisten harjoitusten malliratkaisut MATLABskripteinä. Voit kokeilla itse niiden ajamista ja toimintaa MATLABissa.

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

linux: Prosessit kill PID lopettaa prosessin PID, jos siihen on oikeudet Ctrl + c lopettaa aktiivisen prosessin L7: linux

Ohjelmoinnin perusteet Y Python

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Ohjelmoinnin perusteet Y Python

ATK tähtitieteessä. Osa 5 - IDL datan sovitusta ja muita ominaisuuksia. 25. syyskuuta 2014

Algoritmit 1. Luento 3 Ti Timo Männikkö

Matlab-tietokoneharjoitus

ATK tähtitieteessä. Osa 5 - IDL datan sovitusta ja muita ominaisuuksia. 25. syyskuuta 2014

Ohjelmoinnin perusteet Y Python

Harjoitus 3 -- Ratkaisut

Pienimmän Neliösumman Sovitus (PNS)

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 6: Python

Matlab- ja Maple- ohjelmointi

Python-ohjelmointi Harjoitus 5

Ohjelmoinnin perusteet Y Python

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

IDL - datan sovitus. ATK tähtitieteessä. IDL - esimerkiksi linfit. IDL - esimerkiksi linfit

Ohjelmoinnin perusteet Y Python

CVS. Kätevä väline usein päivitettävien tiedostojen, kuten lähdekoodin, hallitsemiseen

linux linux: käyttäjän oikeudet + lisää ja - poistaa oikeuksia

Tieteellinen laskenta 2 Törmäykset

Ohjelmoinnin perusteet Y Python

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Octave-opas. Mikä on Octave ja miksi? Asennus

linux linux: käyttäjän oikeudet + lisää ja - poistaa oikeuksia

ELEC-C5210 Satunnaisprosessit tietoliikenteessä Harjoitus M1,

Matriiseista. Emmi Koljonen

ATK tähtitieteessä. Osa 2 - IDL perusominaisuudet. 12. syyskuuta 2014

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Tilastolliset ohjelmistot A. Pinja Pikkuhookana

Muita kuvankäsittelyohjelmia on mm. Paint Shop Pro, Photoshop Elements, Microsoft Office Picture Manager

TL5503 DSK, laboraatiot (1.5 op) Suodatus 2 (ver 1.0) Jyrki Laitinen

Matlab-perusteet Harjoitustehtävien ratkaisut

Excel syventävät harjoitukset

Tähtitieteen käytännön menetelmiä Kevät 2009

Laskuharjoitus 2 ( ): Tehtävien vastauksia

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

ASCII-taidetta. Intro: Python

Ohjelmoinnin perusteet Y Python

linux: Ympäristömuuttujat

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Ohjelmoinnin peruskurssi Y1

Mitä on konvoluutio? Tutustu kuvankäsittelyyn

Ohjelmoinnin perusteet Y Python

Luento 5. Timo Savola. 28. huhtikuuta 2006

Jypelin käyttöohjeet» Ruutukentän luominen


Ohjelmoinnin peruskurssi Y1

Tilastolliset toiminnot

StatCrunch -laskentasovellus

Ohjelmoinnin perusteet Y Python

SGN-1200 Signaalinkäsittelyn menetelmät Välikoe

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

Kokonaislukuaritmetiikka vs. logiikkaluupit

LABORAATIOSELOSTUSTEN OHJE H. Honkanen

Moottorin kierrosnopeus Tämän harjoituksen jälkeen:

Juha Haataja

L9: Rayleigh testi. Laskuharjoitus

811120P Diskreetit rakenteet

Ohjelmoinnin perusteet Y Python

Algoritmit C++ Kauko Kolehmainen

1. Lineaarialgebraa A := Matriisin osia voidaan muutella päivittämällä riviä, saraketta tai osamatriisia (Matlabmaisesti): B :=

805324A (805679S) Aikasarja-analyysi Harjoitus 5 (2016)

linux: Prosessit kill PID lopettaa prosessin PID, jos siihen on oikeudet Ctrl + c lopettaa aktiivisen prosessin L7: linux

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 1 / vko 44

TL5503 DSK, laboraatiot (1.5 op) Suodatus 1 (ver 1.0) Jyrki Laitinen

CLT255: Tulosten esittäminen ja niiden arviointi tilastomenetelmillä

Harjoitus 4 -- Ratkaisut

Ohjelmoinnin perusteet Y Python

L9: Rayleigh testi. Laskuharjoitus

SGN-1200 Signaalinkäsittelyn menetelmät, Tentti

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5

Matlab-perusteet. Jukka Jauhiainen. OAMK / Tekniikan yksikkö. Hyvinvointiteknologian koulutusohjelma

Luku 7 Uusien Mallien Tiedostot

Spektri- ja signaalianalysaattorit

Pienimmän Neliösumman Sovitus (PNS)

Harjoitus 2: Ohjelmointi (Matlab)

Ohjelmoinnin peruskurssi Y1

Harjoitus 2: Ohjelmointi (Matlab)

linux: koneelta toiselle

Matriisilaskenta Laskuharjoitus 1 - Ratkaisut / vko 37

Harjoitus 2 -- Ratkaisut

plot(f(x), x=-5..5, y= )

Python-ohjelmointi Harjoitus 2

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Säätötekniikan ja signaalinkäsittelyn työkurssi

1 Olkoon suodattimen vaatimusmäärittely seuraava:

Transkriptio:

SCIENTIFIC PYTHONIN ALKEET ELI: SciPy OPAS Matti Pastell matti.pastell@helsinki.fi Maataloustieteiden laitos, Helsingin yliopisto 12. tammikuuta 2010 0.20 Impulse response 0.15 0.10 0.05 Amplitude 0.00 0.05 0.10 0.15 0.20 0 10 20 30 40 50 n (samples) http://papers.mpastell.com/scipy_opas.pdf

SISÄLTÖ 2 Sisältö 1 Johdanto 3 2 Ohjelman hankinta ja käytön aloitus 4 3 Muuttujat ja peruslaskutoimitukset 4 3.1 Muuttujien määrittely ja peruslaskutoimitukset.......... 4 4 Kuvaajat 7 4.1 Esimerkki kuvaajista........................ 7 5 Tiedostojen käsittely ja hakemistot 10 6 Ohjelmointi 11 6.1 Omat ohjelmat........................... 11 6.2 Funktiot............................... 11 6.3 Toistorakenteet eli silmukat..................... 12 6.4 Ehtolauseet: if, else ja elif...................... 13 7 Tehtävien automatisointi eli Batch-mode 13 8 Signaalin käsittely 15 8.1 IIR - suodattimen suunnittelu.................... 15 8.2 FFT - taajuuden etsintä signaalista................. 16

1 Johdanto 3 1 Johdanto Tämän oppaan tarkoitus on opettaa SciPyn eli Scientific Pythonin 1 peruskäyttö ja hyödyllisiä komentoja. Opas sisältää suurinpiirtein samat osiot kuin MATLAB oppaani ja SciPy tarjoaakin hyvän ilmaisen vaihtoehdon MATLABILLE. SciPyn käyttänä syntaksi on myös hyvin lähellä Matlab-koodia. SciPyn etuna on se, että voit käyttää ohjelmissa myös Python 2 -ohjelmointikielen muita ominaisuuksia ja luoda suhteellisen helposti graafisia sovelluksia, joita saat levittää vapaasti edelleen. Pyrin täydentämään opusta tarpeen mukaan ja viimeisimmän version löytää kotisivuiltani. Suositan aloittelijalle komentojen testaamista samalla, kun luet opasta. Parannusehdotukset ja virheilmoitukset voi lähettää sähköpostitse matti. pastell@helsinki.fi. Opas on kirjoitettu L A TEX- kuvauskielellä. Usein kysytään eikö olisi helpompaa käyttää Exceliä, SPSS tms. Komentorivipohjaiset ohjelmat saattavat tuntua aluksi vaikeilta käyttää, mutta niiden ominaisuudet ovat ylivoimaisia esim. suurten datamäärien käsittelyssä, omien funktioiden kirjoittamisessa ja simuloinnissa. Jatkuvissa mittauksissa syntyy tarve automatisoida datan käsittely. Useita satoja tai tuhansia tiedostoja analysoivan ohjelman teko jollain ohjelmointikielellä (Python, R, MATLAB yms.) on verraten helppoa ja säästää valtavasti aikaa. Lisäksi hieman nopeammissa mittauksissa syntyy niin paljon dataa, että sen käsittely Excelissä on käytännössä mahdotonta. Esim. 50 Hz mittaustaajuudella vuorokauden mittauksessa kertyy n. 4,2 miljoonaa datapistettä eli n. 63 Excelin täyttä saraketta. 1 SciPy http://www.scipy.org 2 Python www.python.org

2 Ohjelman hankinta ja käytön aloitus 4 2 Ohjelman hankinta ja käytön aloitus SciPy on avoimen lähdekoodin tieteellisen laskennan kirjasto Python ohjelmointikieleen. SciPy käyttää NumPy kirjastoa laskutoimituksiin eli saadaakseen ohjelman käyttöönsä tarvitsee asentaa yhdistelmä SciPy+Numpy+Python+Matplotlib, joista viimeksimainittu on kuvien piirto kirjasto. Windowsille helpoin tapa on asentaa Python(x,y)-paketti www.pythonxy.com, jokas sisältää edellä mainitut ja lisäksi Spyder-kehitysympäristön. Useimmissa Linux jakeluista edellämainitut on helppo asentaa pakettienhallinnan kautta ja Mac asennusta varten löydät ohjeet ohjelmien kotisivuilta. Käynnistettyäsi Python tulkin (valikoista tai komentoriviltä komennolla: python) sinun tarvitsee kertoa, mitä kirjastoja haluat käyttää. Saat SciPyn funktiot ja Matplotlibin käyttöösi antamalla komennon: from scipy import * from pylab import * 3 Muuttujat ja peruslaskutoimitukset 3.1 Muuttujien määrittely ja peruslaskutoimitukset Peruslaskutoimitusten teko on helppoa. Muuttujia ei tarvitse erikseen määritellä vaan määrittely tapahtuu automaattisesti, kun muuttujalle annetaan arvo esim. a = 2. Huomaa, että muuttujien kirjankoolla on väliä eli a A. Taulukossa 1 on esitetty peruslaskutoimitusten teko ja peruskomentoja data käsittelyyn. Ohjelmat käsittelevät dataa matriisimuodossa tai vektorimuodossa. Muuttuja, jossa on vain yksi rivi tai sarake on vektori ja muuttuja, jossa on monta saraketta ja riviä on matriisi (array). Vektori tarkoittaa tässä yhteydessä peräkkäistenlukujen järjestettyä joukkoa eikä sillä yleensä ole geometristä merkitystä. Myös matriisimuotoisilla muuttujilla voidaan suorittaa skalaarilaskutoimituksia eli kertoa esimerkiksi vektorin kaikki elementit vakiolla tai toisen vektorin vastaavilla elementeillä. Vektoreista ja matriiseista voidaan valita osia käyttämällä indeksejä. Taulukko/matriisimuotoisena suurenkin datamäärän käsittely on joustavaa joustavaksi. Yleensä perusmittausdatan käsittelyssä ei tarvita osaamista matriisilaskennassa, vaan halutaan esimerkiksi, kertoa ja jakaa koko datamäärä esim. kalibrointikertoimellatms. tämä käy komentoriviltä hyvin helposti. Usein laskutoimituksia halutaan suorittaa myös riveittäin eli esim. laskea jokaisen rivin summa, keskiarvo tai keskihajonta.

3.1 Muuttujien määrittely ja peruslaskutoimitukset 5 SciPyssä on muutamia esim. Matlabista ja R:stä poikkeavia ominaisuuksia, jotka on hyvä muistaa: Pythonille tarvitsee kertoa että kyseessä on desimaaliluku tai ohjelma pyöristää laskutoimituksien tulokset kokonaisuvuksi eli laskutoimitus 3/2 antaa vastauksen 1, mutta 3.0/2 tai 3./2 vastauksen 1.5. Lukujoukkoja luodessa välin viimeinen luku ei sisälly joukkoon esim. komento arange(1.,11) luo vektorin jossa on elementit 1-10. Pythonissa indeksit alkavat alkavat nollasta eli muuttujan a ensimmäinen elementti saadaan valittua komennolla a[0]. Matriisien indeksit annetaan samoin kuten matematiikassakin eli järjestyksessä [rivi, sarake]

3.1 Muuttujien määrittely ja peruslaskutoimitukset 6 Taulukko 1: Peruslaskutoimitukset ja muuttujien indeksointi SciPy:ssa Operaatio ja huomioita Komento, muuttujat a ja b ovat vektoreita ja muuttuja X ja Y matriiseja Muuttujien luominen a = 1. Vektori: luvut 1-10 a = arange(1., 11) X = array([[3, 2], [4, 1], [6, 3]]) Perusoperaatiot elementeittäin * + -/ 2. + 5.5; a-3; a*b; X/Y Potenssit 2**3; a**2; X**10 Neliöjuuri sqrt(a) Osajoukon valinta b = a[0:5] matriisin indeksit järjestyksessä [rivi, sarake] Y = X[0:2, 2:5] Elementtien määrä len(x); shape(x) Summa sum(x); sum(x) sarakkeittain sum(x, 0) riveittäin sum(x, 1) Keskiarvo mean(x); mean(x) sarakkeittain mean(x, 0) riveittäin mean(x, 1) Keskihajonta std(x); std(x) sarakkeittain std(x, 0) riveittäin std(x, 1) Kumulatiivinen summa cumsum(x); cumsum(x) sarakkeittain cumsum(x, 0) riveittäin cumsum(x, 1) Vektori ja matriisitulo dot(a,b); dot(x,y) Transponointi transpose(x) Ajettavan ohjelman keskeytys CTRL + C Satunnaislukujen luonti rand(100) normaalijakaumasta randn(10,10) Muuttujan poisto del a Komennon ohje help(mean); help(std)

4 Kuvaajat 7 Taulukko 2: Kuvien piirto Operaatio Komento, x ja y ovat vektoreita Viivakuvaaja plot(x,y); plot(x,y, r ) Pylväskuvaaja bar(x,y) Histogrammi plot(x,y) Boxplot boxplot(x,y) Viivan selite legend( viiva ) Akselien nimet xlabel( x-akseli ); ylabel( y-akseli ) Kuvaajan otsikko title( kuvaajan otsikko ) Akselien skaalaus axis([x-pienin, x-suurin, y-pienin, y- suurin]) Useampi samalle sivulle subplot(221); numerot = rivien määrä, sarakkeiden määrä, monesko kuva Kuvan talennus savefig( kuva.pdf ); savefig( kuva.png, dpi = 300 ) 4 Kuvaajat Usein datasta halutaan myös kuvaaja. Scipyssä on mahdollisuus piirtää useita erilaisia kuvaajia Matplotlib - kirjaston avulla, alla muutamia yksinkertaisia esimerkkejä. Joskus kuvaaja saadaan näkyviin plottauskäskyn jälkeen vasta antamalla komento show(), tämä riippuu Matplotlibin sen hetkisistä asetuksista jotka vaihtelevat esim. käyttöliittymien ja käyttöjärjestelmien välillä. Verkosta löytyy myös paljon hyviä ohjeita kuvien laatimiseen, kuten www.scipy.org/cookbook/ Matplotlib/. Taulukossa 2 on listattu perusplottauskomentoja ja alla on esimerkki niiden käytöstä. Esimerkin tulos näkyy kuvassa 1. Kuvan tallentaminen tiedostoon onnistuu käskyllä savefig ( ' kuva.pdf ' ), tiedostomuoto määritellään antamalla kuvalle oikea pääte, tuettuja ovat mm. png, pdf, eps, svg. Kuvan voi tallentaa myös kuvaajan valikosta klikkaamalla levykkeen kuvaa. Vektorimuotoisia kuvia tallentaessa laatu on aina hyvä, mutta esimerkiksi png kuvalle kannattaa valita 300dpi:n resoluutio jos kuvia aikoo käyttää esim. gradussa. 4.1 Esimerkki kuvaajista Ao. esimerkissä esitellään muutamia kuvanpiirtokomentoja, lopputulos kuvassa 1.

4.1 Esimerkki kuvaajista 8 from pylab import * #Tehdään 4 kuvaajaa samalle sivulle, 1 kuvaaja subplot(221) #Luodaan data n = 128. x = arange(n)/n y = sin(0.125*pi*n*x**2) #Piirretään kuva, punainen viiva plot(x,y,'r') title("plot(x,y,'r')") xlabel('x') #Matplotlib tukee Latexin käyttöä tekstissä ylabel(r $sin(0.125n \cdot x^2)$ ) #Toinen kuva sivulle subplot(222) x = arange(0, 2*pi, 0.2) y = sin(x) stem(x,y) axis([0, 2*pi, -1.2, 1.2]) xlabel('x') ylabel('sinx(x)') title('stem(x,y)') subplot(223) y = randn(1000) hist(y) title('hist(y)') xlabel('bin') ylabel('count') subplot(224) boxplot(y) ylabel('y') title('boxplot(y)') #Tallennetaan kuva savefig('kuvat.pdf')

4.1 Esimerkki kuvaajista 9 1.0 plot(x,y, r ) sin(0.125n x 2 ) sinx(x) count 0.5 0.0 0.5 1.0 0.0 0.2 0.4 0.6 0.8 1.0 x 1.0 0.5 0.0 0.5 1.0 stem(x,y) 0 1 2 3 4 5 6 x hist(y) 300 250 200 150 100 50 0 4 3 2 1 0 1 2 3 4 bin Kuva 1: Muutamia peruskuvaajatyyppejä

5 Tiedostojen käsittely ja hakemistot 10 5 Tiedostojen käsittely ja hakemistot Tiedostojen ja hakemistojen käsittelyn on Pythonissa os-moduulissa 3 ja globmoduulissa 4 on kätevä komento tiedoston listaukseen ehtojen mukaan. Alla esimerkkejä käytöstä: #Tuodaan kirjasto import os #Listataan hakemiston sisältö os.listdir('.') #Siirrytään hakemistoon data os.chdir('data') #Tarkistetaan missä hakemistossa ollaan. os.getcwd() #Listataan kaikki tekstitiedostot import glob glob.glob('*.txt') NumPy-kirjastossa on funktiot loadtxt ja savetxt numeroarvoja sisältävien ASCII - tiedostojen lukemiseen ja tallentamiseen. Sekä funktiot load ja save Num- Pyn oman binääriformaattia varten ja scipy.io kirjastosta löytyy funktiot loadmat ja savemat Matlabin datatiedostoille. Excel tiedostojen lukemiseen ja kirjoittamiseen sopivat kirjastot ovat nimeltään xlrd ja xlwt. Muutamia esimerkkejä: from pylab import * #Luetaan numeerinen data, jossa on yksi otsikkorivi data = np.loadtxt('data.txt', skiprows = 1) #Tallennetaan data NumPyn formaattiin data=dlmread('data.txt','\t',1,0); #Avataan tallennettu tiedosto load tiedosto.mat 3 http://docs.python.org/library/os.html 4 http://docs.python.org/library/glob.html

6 Ohjelmointi 11 6 Ohjelmointi 6.1 Omat ohjelmat Komentorivipohjaisten ohjelmien todellin hyöty tulee esille, kun aikaisemmissa kappaleissa esitellyistä komennoista kerätään oma ohjelma. Esimerkiksi kuvien piirto kappaleen esimerkki on oma ohjelmansa, joka luo esimerkkidataa ja tekee niistä kuvan. Ohjelma voi sisältää omia funktioita, toistorakenteita ja ehtolauseita tms. Python ohjelmat ovat tekstitiedostoja, joissa on peräkkäin suoritettavia komentoja. Tiedostoille annetaan yleensä pääte.py. Ohjelman voi tehdä esim. Pydeen editorilla, mutta myös millä tahansa muulla editorilla. Pythonissa eri ohjelmointirakenteet erotetaan toisistaan sisennyksellä eikä esim, suluilla joten komentoja edeltävä tyhjä tila on merkityksellinen osa koodia. Ohjelma saadaan ajettua Python-komentotulkista komennolla execfile( ohjelma.py ) ja suoraan käyttöjärjestelmän komentoriviltä python ohjelma.py. 6.2 Funktiot Funktio on kätevä tapa lisätä ohjelmaan usein toistettavia laskutoimituksia. Esimerkiksi SciPyn keskiarvon laskeva komento mean on funktio, joka laskee keskiarvon. Voi tarkastella minkä tahansa funktion koodia antamalla komennon source # esim. source(mean). Funktiot määritellään ohjelman alussa. Funktiota kutsutaan komentoriviltä ja sille annetaan haluttu määrä argumentteja (dataa, kertoimia tms.) ja myös kerrotaan mitä muuttujia funktion halutaan palauttavan. Erotuksena skriptiin funktio toimii omassa työtilassaan eli funktiossa määritellyt muuttujat eivät jää ohjelman muistiin. Tehdään esimerkkifunktio, joka laskee yleisesti käytettäviä tilastollisia tunnuslukuja, huomaa että sisennys on merkityksellinen. #Tämä on esimerkkifunktio kluvut, joka laskee siihen # syötetyn datan keskiarvon, hajonnan ja keskiarvon #keskivirheen. Kutsu komentoriviltämuotoa [ #keskiarvo, keskihajonta,keskivirhe]=kluvut(arvo) #HUOMAA, että 'keskiarvo, keskihajonta, keskivirhe #ja x' ovat muuttujan nimiä ja niiden tilalla #voidaan käyttää haluttuja nimiä. Muuttujassa "x" on # käsiteltävä data, 'keskiarvo, keskihajonta ja #keskivirhe' ovat funktion tuloksia.

6.3 Toistorakenteet eli silmukat 12 def kluvut(x): keskiarvo = mean(x) keskihajonta = std(x) #Lasketaan datassa olevien arvojen määrä, eli n n = len(x) #Keskiarvon keskivirhe on keskihajonta n keskivirhe = keskihajonta/sqrt(n) #Komentoriville palautettavat arvot return(keskiarvo, keskihajonta, keskivirhe) Kun olet tehnyt funktion aja se python tulkissa (execfile tai liitä suoraan tulkiin). Tämän jälkeen testataan, että funktio toimii: Luodaan funktiolle annettavat arvot, 1000 satunnaislukua data=rand(1000) #Kutsutaan äsken tehtyä funktiota kluvut #komentoriviltä ja tallennetaan tulokset muuttujiin x, y ja z x,y,z = kluvut(data) 6.3 Toistorakenteet eli silmukat Yksi lähes joka ohjelmassa tarvittava komponentti on silmukka eli loop. Silmukan sisällä olevat toiminnot toistetaan jokaisella ajokerralla. Silmukkaa tarvitaan esimerkiksi simuloinnissa tai jos halutaan suorittaa lukea monta tiedostoa ohjelmaan ja analysoida ne samalla tavalla. Silmukka ajetaan niin monta kertaa, kunnes annettu pysäytysehto täyttyy. Yleensä toiminta saadaan suoritettua käyttämällä for - looppia, joka ajaa komennot tietyn määrän kertoja. from pylab import * #Esimerkki ajetaan silmukka 10 kertaa, muuttuja #kerta saa jokaisella ajokerralla uuden arvon. #Ajamalla ohjelman saat käsityksen mitä tapahtuu #loopissa.. #Luodaan loopissa käytettävä muuttuja vektori vektori = repeat(0., 10) #Aloitetaan silmukka for (kerta = arange(1,11)): kerta

6.4 Ehtolauseet: if, else ja elif 13 #Rakennetaan loopilla vektori, joka saa aina # arvon kerta*2 vektori[kerta] = kerta*2 6.4 Ehtolauseet: if, else ja elif Silmukoiden lisäksi ohjelmissa tarvitaan usein ehtolauseita, joilla kontrolloidaan tiettyjen käskyjen suorittamista. Ehtolauseet toteutetaan komennoilla if, else ja elif. Yksinkertaisia esimerkkejä: #b=3 jos a>4 if a > 4: b = 3 #b=3 jos a>3 ja b=6 jos a<2, muussa tapauksessa b=0 if a > 3: b = 3 elif a < 2: b = 6 else: b=0 7 Tehtävien automatisointi eli Batch-mode Usein mittauksissa kertyy suuri määrä samanlaisia tai lähes samanlaisia tiedostoja joiden käsittely halutaan tehdä mahdollisimman automaattisesti. Tämä tapahtuu tekemällä oma peräkkäisistä komennoista koostuva ohjelma, jolla voi vaikkapa laskea kaikkien hakemistossa olevien tiedostojen keskiarvon. Esimerkkinä käytän lehmän jalkapainomittauksesta saatua dataa, jonka voi ladata internetistä http://files.mpastell.com/hdata.zip. Data on saatu mittaamalla lehmän jokaisen jalan painoa erikseen lypsyn aikana ja tiedosto koostuu neljästä sarakkeesta, joista jokaisessa on yhden jalan paino. Esimerkissä lasketaan jokaisen jalan keskipaino ja keskihajonta lehmän kokonaispaino, ja tallennetaan jokaisesta tiedostosta kuvaaja erilliseen hakemistoon. # -*- coding: utf-8 -*- #Ensimmäinen rivi mahdollistaa skandimerkit #kommenteissa

7 Tehtävien automatisointi eli Batch-mode 14 from pylab import * from glob import glob from os import mkdir #Datassa on otsikkorivi ja itse mittaustieto 7:ssä #sarakkeessa. Harjoituksessa käytetään sarakkeita #2-5, joissa on lehmän jokaisen jalan paino lypsyn #aikana. Luetaan kaikki hakemiston tekstitiedostot #muuttujaan 'tiedostot' tiedostot = glob('*.txt') #Lasketaan tiedostojen määrä ja luodaan hakemisto #kuville maara = len(tiedostot) #Luodaan tyhjät matriisit arvojen tallennusta varten keskiarvo = zeros((maara, 4)) keskihajonta = zeros((maara, 4)) #Ajetaan silmukka, jossa käsitellään kaikki #hakemistossa olevat tiedostot for kerta in arange(maara): #Luetaan silmukan ajokerran osoittama tiedosto data = np.loadtxt(tiedostot[kerta], skiprows = 1) #Valitaan kiinnostuksen kohteena oleva sarakkeet # 2-5 data = data[:, 2:5] #Lasketaan lehmän kokonaispaino jalkapainojen #summana data = column_stack((data, sum(data, 1))) #Lasketaan tiedoston jokaisen sarakkeen #keskiarvo. Lopuksi muuttujassa on kaikkien #tiedostojen keskiarvot, jokainen omalla #rivillään. keskiarvo[kerta, 0:4] = mean(data,0) #Lasketaan keskihajonta keskihajonta[kerta,0:4]=std(data,0) #Piirretään kuvaaja ja lisätään selitteet plot(data) xlabel('measurement point') ylabel('weight (kg)') #Tallenetaan kuvaaja

8 Signaalin käsittely 15 savefig('kuvat/kuva' + str(kerta) + '.png') #Tyhjennetään kuvaaja seuraavaa varten clf() #Tulostetaan tulokset silmukan jälkeen ruudulle print 'Keskiarvot: \n', keskiarvo print 'Keskihajonnat: \n', keskihajonta 8 Signaalin käsittely 8.1 IIR - suodattimen suunnittelu SciPyn signal kirjasto sisältää hyvät funktiot IIR-suodattimien suuuunitteluun, mutta siinä ei ole esim. vaihevasteen ja impulssibasteen laskevia funktioita. Alla olevassa esimerkissä tehdään ensin kaksi omaa funktiota ja suunnitellaan sitten elliptinen kaistanpäästösuodatin. Tulokset ovat kuvassa 2. # -*- coding: utf-8 -*- import scipy.signal as signal from pylab import * #Laskee ja plottaa IIR tai FIR suodattimen taajuus- # ja vaihevasteen def mfreqz(b,a=1): w,h = signal.freqz(b,a) h_db = 20 * log10 (abs(h)) subplot(211) plot(w/max(w),h_db,'k') ylim(-150, 5) ylabel('magnitude (db)') xlabel(r'normalized Frequency ( x$\pi$rad/sample)') title(r'frequency response') subplot(212) h_phase = unwrap(arctan2(imag(h),real(h))) plot(w/max(w),h_phase,'k') ylabel('phase (radians)') xlabel(r'normalized Frequency ( x$\pi$rad/sample)')

8.2 FFT - taajuuden etsintä signaalista 16 title(r'phase response') subplots_adjust(hspace=0.5) #Laskee ja plottaa IIR tai FIR suodattimen impulssi- # ja askelvasteen def impz(b,a=1): impulse = repeat(0.,50); impulse[0] =1. x = arange(0,50) response = signal.lfilter(b,a,impulse) subplot(211) stem(x, response,'k','ko','k') ylabel('amplitude') xlabel(r'n (samples)') title(r'impulse response') subplot(212) step = cumsum(response) stem(x, step, 'k','ko','k') ylabel('amplitude') xlabel(r'n (samples)') title(r'step response') subplots_adjust(hspace=0.5) #Suunnitellaan elliptinen kaistanpäästösuodatin, #päästökaista 0.05-0.3 kertaa Nyquistin taajuus, #estokaistan vaimennus 60 db, päästökaistan #vaimennus 1 db b,a = signal.iirdesign(wp = [0.05, 0.3], ws= [0.02, 0.32], gstop= 60, gpass=1, ftype='ellip') mfreqz(b,a) savefig('figs/freqz.pdf') figure(2) impz(b,a) savefig('figs/impz.pdf') show() 8.2 FFT - taajuuden etsintä signaalista FFT (Fast Fourier Transform) on laskentamenetelmä, jolla voidaan laskea eri signaalissa esiintyvien taajuuksien voimakkuus. Muunnoksen tulosta kutsutaan te-

8.2 FFT - taajuuden etsintä signaalista 17 hospektriksi ja SciPyssä on sen laskemiseen ja piirtämiseen valmis funktio psd. Alla esimerkki FFT:n laskemisesta, tulos Kuvassa 3. #Luodaan signaali x = sin(linspace(0., 500, 1024)) + 0.5*cos(linspace(0, 750, 1024)) subplot(211) plot((x)[0:250]) title('signal') ylabel('signal strength') xlabel('sample number') subplot(212) #FFT muunnos ja plottaus, tehdään 1024 pisteelle psd(x, NFFT = 1024) savefig('figs/psd.pdf') show()

8.2 FFT - taajuuden etsintä signaalista 18 Magnitude (db) Phase (radians) 0 20 40 60 80 100 120 140 10 5 0 5 10 Frequency response 0.0 0.2 0.4 0.6 0.8 1.0 Normalized Frequency (xπrad/sample) Phase response 15 15 0.0 0.2 0.4 0.6 0.8 1.0 Normalized Frequency (xπrad/sample) Amplitude Amplitude 0.20 0.15 0.10 0.05 0.00 0.05 0.10 0.15 0.20 0.3 0.2 0.1 0.0 0.1 0.2 0.3 0.4 Impulse response 0 10 20 30 40 50 n (samples) Step response 0 10 20 30 40 50 n (samples) Kuva 2: Suunnitellun IIR-suodattimen taajuus-, vaihe-, impulssi- ja askelvaste.

8.2 FFT - taajuuden etsintä signaalista 19 Signal strength 1.5 1.0 0.5 0.0 0.5 1.0 1.5 signal 0 50 100 150 200 250 Sample number Power Spectral Density (db/hz) 40 20 20 0 40 60 80 100 120 140 160 180 200 0.0 0.2 0.4 0.6 0.8 1.0 Frequency Kuva 3: Generoitu signaali ja sen tehospektri