Edit detail for SciPy revision 2 of 1

2
Editor: pycz
Time: 2014/07/14 21:15:47 GMT+2
Note:

changed:
-
Č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'.
  <pre>
  >> scipy.array([6,5,3],[2,7,4],[3,3,3])
    [[6,5,3],
     [2,7,4],
     [3,3,3]]
  </pre>
  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 ako 'scipy.zeros'

  - 'scipy.arange(9)' vytvorí jednorozmerné pole s 9 prvkami. 
    <pre>
    >> scipy.arange(9)
       [0,1,2,3,4,5,6,7,8] 
    </pre>
    My však potrebujeme pole povedzme 3 x 3, ako v predchádzajúcich prípadoch. Na pomoc si zavoláme funkciu 'scipy.reshape'
    <pre>
    >> a = arange(9)
    >> scipy.reshape(a,(3,3))
       [[0,1,2],
        [3,4,5],
        [6,7,8]]
    </pre>

  - '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.<br>
 Práca s **Weave** začína importovaním modulu: <br>
 'from weave import *'

Zadávanie kódu je 
 možné tromi spôsobmi:

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

  <pre>
  import weave    
  a  = 1
  weave.inline('printf("%d\\n",a);',['a'])
  </pre>
  Výsledkom bude výpis čísla 1.<br>
  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":http://www.scipy.org/documentation/weave/weaveusersguide.html#Inline.

 2 'blitz()'<br>
  '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 
  <pre>
  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.
  </pre>
  v **blitz** napíšete ako 
  <pre>
  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)
  </pre>
  **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**<br>
  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":http://www.scipy.org/documentation/weave/weaveusersguide.html#blitz_limitations o tomto obmedzení.

   Viac o ňom nájdete "tuto":http://www.scipy.org/documentation/weave/weaveusersguide.html#Blitz.


 3 Extension Modules
  Rozširujúce moduly napísané v C, C++, alebo Fortrane. Viac o ňom "tuto":http://www.scipy.org/documentation/weave/weaveusersguide.html#extension_modules.

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/



Č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 ako scipy.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 funkciu scipy.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:

  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/