Čo je SciPy
SciPy je zbierka matematických algoritmov a funkcií postavená na module Numeric (New SciPy, ktorý je vo vývoji už nebude závislý na Numeric). SciPy pridáva nášmu milého Pythonu obrovské možnosti vo vysokoúrovňovom spracovaní a vizualizácii dát, dokonca sa stáva rivalom takým programom, ako je Matlab, IDL, Octave, Sci-lab, či Maple.
Obsahuje moduly pre paralelne spracovanie dát, fourierovu analýzu, genetické algoritmy, integrovanie, interpolovanie, lineárnu algebru, ale aj vizualizáciu vypočítaných dát. Hlavnou úlohou ale ostáva rýchle, efektívne a jednoduche spracovanie polí a práca s nimi.
Zmätok ohľadom názvov
Uvediem trochu do poriadku zmätok ohľadom názvoslovia.
S balíkom SciPy sa spájajú tri (prípadne až štyri) názvy.
- SciPy - Samotný balík, ktorý slúži na vedecké výpočty. V poslednej dobe sa delí na New_SciPy a Old_SciPy. New_SciPy sa líši od Old_SciPy tým, že ako engine na prácu s poliami používa scipy_core. Old_SciPy k tomu používa NumPy?.
- scipy_core - náhrada a spojenie dvoch starších nekompatibilných balíkov pre prácu s poliami a funkciami - NumPy? (zvaný aj Numeric) a NumArray?.
- NumPy? - Prvý a pôvodný balík určený na prácu s multidimenzionálnymi poliami a funkciami v Pythone
- NumArray? - Následník NumPy? (nekompatibilný), ktorý sa začal vyvíjať po tom, ako sa nezhodla komunita na NumPy? a po zastavení vývoja NumPy?
scipy_core sa snaží byť tým prvkom, ktorý naspäť stmelí a tým aj posilní rozdelenú komunitu (NumPy? a NumArray?). V scipy_core je implementovaný celý NumPy? a veľká väčšina funkcionality NumArray?. Zatiaľ nie sú (a podľa vyjadrení hlavného vývojara Travisa Oliphanta, možno ani nebudú) implementované iba niektoré časti NumArray?, ktoré sú už z princípu nekompatibilné s enginom NumPy? a scipy_core.
[1] Takže z toho vyplýva, že na prácu s New_SciPy (t.j aktuálne 0.4.3) vám stačí scipy_core (aktuálne 0.6.2). Nemusíte (ale môžete kvôli spätnej kompatibilite - hlavne namespace) nainštalovať aj NumPy?. Existuje však script (netuším nakoľko aktuálny), ktorý by mal viacmenej automaticky upraviť programy napísane pre NumPy? pre prácu so scipy_core.
Rýchly úvod
Pre prácu so SciPy si treba najprv naimportovať modul import scipy
, alebo from scipy import *
. Hlavným dôvodom, prečo SciPy vznikol je podpora rýchlych polí. Tak si ukážeme, ako si jednoducho a rýchlo vytvoriť pole. Základným spôsobom je použitie array
.
>> scipy.array([6,5,3],[2,7,4],[3,3,3]) [[6,5,3], [2,7,4], [3,3,3]]Takto si vytvoríme pole vymenovaním. Pri tomto spôsobe hneď určíme poľu shape(tvar poľa). Často však potrebujeme urobiť veľké polia, a nechceme sa s nimi babrať ručne. Na to tu máme zopár funkcií -
scipy.zeros
,scipy.ones
,scipy.empty
,scipy.arange
,scipy.identity
.
scipy.zeros((3,3))
vytvorí pole 3 x 3 vyplnené nulami.- podobne
scipy.ones((3,3))
vytvorí pole 3 x 3 vyplnené jedničkami. scipy.empty((3,3))
vytvorí neinicializované pole 3 x 3 - používa sa v prípade, že potrebujete iba určiť rozmery výsledneho poľa. Je to asi 200x rýchlejší spôsob akoscipy.zeros
scipy.arange(9)
vytvorí jednorozmerné pole s 9 prvkami.>> scipy.arange(9) [0,1,2,3,4,5,6,7,8]
My však potrebujeme pole povedzme 3 x 3, ako v predchádzajúcich prípadoch. Na pomoc si zavoláme funkciuscipy.reshape
>> a = arange(9) >> scipy.reshape(a,(3,3)) [[0,1,2], [3,4,5], [6,7,8]]
scipy.identity(5)
vytvorí jednotkovú maticu veľkosti 5.- zatiaľ iba informatívne spomeniem, že podobne máme na vytvorenie poľa ešte funkcie
scipy.fromstring()
,scipy.fromfunction()
Weave
SciPy obsahuje modul Weave pre vkladanie kodu C, C++ a Fortran77.
Práca s Weave začína importovaním modulu:
from weave import *
Zadávanie kódu je možné tromi spôsobmi:
inline()
Pomocouinline()
sa vkladá C kód priamo do pythonovského kódu.
Príklad:import weave a = 1 weave.inline(
Výsledkom bude výpis čísla 1.printf("%d\\n",a);
,['a'])
Po prvom spustení skriptu sa skompiluje vložený kód a pri ďalších spusteniach sa už iba použije skompilovaný. Ak z nejakého dôvodu potrebujete kompilovať kód po každom spustení skriptu, je možné použiť argumentweave.inline(code,force = 1)
. Ďalším argumentom je compiler. Pomocou neho môžete nastaviť explicitne kompilátor, pomocou ktorého sa bude kód kompilovať. Na windowsoch je implicitne nastavené MSVC. Ak sa MSVC nenájde, hľadá sa v distutils ďalší kompilátor. Na unixoch je implicitný gcc.weave.inline(code,compiler = "gcc")
. Kompletný zoznam argumentov nájdete v "dokumentácii":http://www.scipy.org/documentation/weave/weaveusersguide.html#inline_arguments. Viac o inline nájdete tuto.blitz()
Blitz()
je spôsob ako zrýchliť vykonávanie pythonovského kódu bez toho, aby sa musel ručne prepisovať do C. Používa sa veľmi jednoducho. Čo by ste v pythone napísali akoa[1:-1,1:-1] = (b[1:-1,1:-1] + b[2:,1:-1] + b[:-2,1:-1] + b[1:-1,2:] + b[1:-1,:-2]) / 5.
v blitz napíšete akoimport weave expr = "a[1:-1,1:-1] = (b[1:-1,1:-1] + b[2:,1:-1] + b[:-2,1:-1] + b[1:-1,2:] + b[1:-1,:-2]) / 5." weave.blitz(expr)
Blitz vlastne urobí to, že sa daný kód prepíše zo všeobecného C kódu používaného v pythone, do práve pre túto funkciu optimalizovaného C kódu. Po prvom spustení sa podobne ako v inline skompiluje kód a pri ďalších sa už iba používa skompilovaný. Obmedzenia
Zatiaľ to vyzerá dosť dobre. Za málo práce máme zrýchlenie kódu. blitz sa ale nedá použiť na všetky konštrukcie pythonu.- Blitz zvláda všetky štandardné matematické operátory okrem ** - umocnenia.
- Blitz pracuje iba s výrazmi ktoré obsahujú priradenie. Tzn. ak chceme s "blitzovského" kódu niečo dostať, musíme to priradiť do premennej.
weave.blitz("a = b + c")
- Blitz nie je efektívny pre kód, ktorý obsahuje veľa
if
/then
. Najlepšie výsledky dosiahnete s kódom, ktorý by sa dal "vektorizovať" - Blitz môže niekedy dávať iné výsledky ako Scipy. Viac o tomto obmedzení.
Viac o ňom nájdete tuto.
- Extension Modules Rozširujúce moduly napísané v C, C++, alebo Fortrane. Viac o ňom tuto.
Nezabudnite, že na prácu s Weave musíte mať nainštalovaný nejaký compiler C, C++ alebo Fortranu. Najbežnejšie sa používa gcc pod linuxom, a MSVC, alebo MinGW? pod Windowsom.
Odkazy