Č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_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.

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:

  1. inline()
    Pomocou inline() sa vkladá C kód priamo do pythonovského kódu.
    Príklad:

      import weave    
      a  = 1
      weave.inline(printf("%d\\n",a);,['a'])
      
    Výsledkom bude výpis čísla 1.
    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ť argument weave.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.

  2. 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 ako
      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.
      
    v blitz napíšete ako
      import 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.

  3. 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

http://www.scipy.org/