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/
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.
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.
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.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.scipy.fromstring()
,scipy.fromfunction()
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()
inline()
sa vkladá C kód priamo do pythonovského kódu.
import weave
a = 1
weave.inline(printf("%d\\n",a);
,['a'])
Výsledkom bude výpis čísla 1.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.
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
weave.blitz("a = b + c")
if
/then
. Najlepšie výsledky dosiahnete s kódom, ktorý by sa dal "vektorizovať"Viac o ňom nájdete 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.