Vous êtes sur la page 1sur 14

suivant

prcdent |
Python scientifique
Scipy : le calcul numrique haut-niveau
Scipy
Le module scipy regroupe un
certain nombre de sous modules qui
sont autant de botes outils de
routines courantes de calcul
numrique, regroupes par fonction
fonctions spciales, interpolation,
intgration, optimisation, traitement
d!images"
#l e$iste dans le monde du calcul
scientifique d!autres biblioth%ques
standard d!outils de calcul
numriques &e$ la 'SL ( ')*
Scientific Library pour les
programmes en +,+--, ou les
toolbo$es de .atlab/" Les
scientifiques ont trop souvent tendance oublier leur e$istence et rinventer la roue en
reprogrammant leur algorithmes d!intgration, d!optimisation, etc" 0uand c!est possible, il vaut
mieu$ se servir des outils d1 crits &tests et optimiss 2/"
Le type de base en entre des routines scipy est le tableau numpy.ndarray, ce qui permet
d!appliquer ces oprations haut(niveau directement au$ tableau$ numpy &et de fa3on tr%s efficace/"
4arning
+e cours n!est pas une introduction au$ mthodes de calcul scientifique, et il serait bien ennuyeu$
d!numrer une longue liste des diffrentes fonctions et modules de scipy" 5n a donc choisi de se
concentrer ici sur quelques e$emples simples pour donner une ide gnrale de ce que scipy peut
apporter ses utilisateurs" 6 chacun ensuite de dfinir les mthodes numriques dont il a besoin, et
de chercher ce qu!il peut utiliser l!intrieur des sous(modules pertinents"
Pour commencer
>>> import scipy
Fonctions spciales : scipy.special
*ne biblioth%que de fonctions spciales qu!on retrouve frquemment" 7eaucoup de fonctions
courantes sont d1 dans numpy
[In 57]: np.cos, np.sinc, np.tanh
(<ufunc 'cos'>, <function sinc at 0!ad"#"c>, <ufunc 'tanh'>$
il faut chercher les autres dans scipy.special"
Exemple fonctions de 7essel du premier type
&source linu$ mag 8S9: http,,;;;"linu$mag(france"org,produit"php<produit=>:?, 'a@l
Aaroquau$/
>>> from scipy.special import %n
>>> inde & '
>>> & np.linspace(0, '0, (00$
>>> y & %n(inde, $
Bt bien d!autres fonctions )amma, "eta, erf, airy, le)endre, fonctions
ellipti*ues, etc"
Algbre linaire : scipy.linal)
Les oprations classiques d!alg%bre linaire"
Oprations basiques
>>> from scipy import linal)
>>> a & np.array([[', (], [+, ,]]$
>>> a & scipy.mat(a$ - la transformation ta"leau ..> matrice est tres simple /
>>> linal).ei)0als(a$ - 0aleurs propres
array([.0.+7((!'+(10.%, 5.+7((!'+(10.%]$
>>> linal).det(a$ - determinant
.(.0
>>> a.I - matrice in0erse
matri([[.(. , '. ],
[ '.5, .0.5]]$
>>> linal).in0(a$ - autre ecriture possi"le
array([[.(. , '. ],
[ '.5, .0.5]]$
""" ou moins basiques" B$emple dcomposition en valeurs singuli%res &SAC/
>>> 2 & scipy.mat('[' + (3 ' ( +]'$ -matrice non carr4e
>>> 5,s,6h & linal).s0d(2$
>>> s - spectre de 2
array([ 5.'7#'5(,(, '. ]$
>>> print 5
[[.0.707'0#7! .0.707'0#7!]
[.0.707'0#7! 0.707'0#7!]]
La SAC est tr%s employe en statistiques ou en traitement du signal"
>>> l & scipy.lena($
>>> ro8s, 8ei)ht, columns & linal).s0d(l, full9matrices&:alse$
>>> 8hite9lena & np.dot(ro8s, columns$
>>> 8ei)ht[(0:]&0
>>> ; & scipy.mat(linal).dia)s0d(8ei)ht,5'(,5'($$
>>> filtered9lena & np.dot(ro8s, np.dot(;, columns$$
5n trouve dans scipy.linal) bien d!autres dcompositions classiques &0D, L*, +holesEy,
Schur/, des solveurs de syst%mes linaires, etc"
Interpolation : scipy.interpolate
>>> import scipy.interpolate
>>> & np.linspace(0, ', '0$
>>> y & np.sin((<np.pi<$
>>> linear9interp & scipy.interpolate.interp'd(, y$ -par defaut, interpolateur
lineaire
>>> cu"ic9interp & scipy.interpolate.interp'd(, y, =ind&'cu"ic'$ -interpolateur
cu"i*ue
>>> fine9 & np.linspace(0, ', 50$
>>> y9fromlinearinterp & linear9interp(fine9$
>>> y9fromcu"icinterp & cu"ic9interp(fine9$
In [(,#]: plot(, y, 'o', ms&#, la"el&'points ori)inau'$
>ut[(,#]: [<matplotli".lines.?ine(@ o"%ect at 07"a55ec>]
In [(,7]: plot(fine9, y9fromlinearinterp, '.', l8&(,
la"el&'interpolation lineaire'$
>ut[(,7]: [<matplotli".lines.?ine(@ o"%ect at 0c!+00cc>]
In [(,!]: plot(fine9, y9fromcu"icinterp, '.', l8&(, la"el&'interpolation
cu"i*ue'$
>ut[(,!]: [<matplotli".lines.?ine(@ o"%ect at 0c#'#",c>]
Pour des mthodes d!interpolation par splines plus gnral, voir
scipy.interpolate.splrep et scipy.interpolate.sple0"
scipy.interpolate.interp(d est similaire interp'd, pour des tableau$ FC" &mettre
une image </
Intgration : scipy.inte)rate
Ciffrentes routines d!intgration numrique" scipy.inte)rate.*uad est la plus gnrale
In [7(]: from scipy.inte)rate import *uad
In [7+]: *uad(np.sin, 0, np.piA($
>ut[7+]: (0.777777777777777!7, '.''0((+0(,#(5'5#,e.',$
In [7,]: -erreur trBs fai"le (l'erreur souhait4e est un paramBtre optionnel de
*uad$
In [75]: ' . >ut[7+][0]
>ut[75]: '.''0((+0(,#(5'5#5e.'#
mais il en e$iste d!autres dans ce sous(module"
Equations i!!rentielles orinaires "O#E$
Cans ce sous(module, on trouve galement un solveur d!quations diffrentielles ordinaires,
scipy.inte)rate.odeint" #l s!agit d!un solveur gnrique asseG sophistiqu, adapt pour les
probl%mes raides &stiff en anglais/ ou non raides" odeint rsout des syst%mes d!5CB du premier
ordre de la forme
dy'Adt & rhs'(y', y(, .., t0,...$
dy(Adt & rhs((y', y(, .., t0,...$
"""
B$emple rsolvons l!5CB dyAdt & .(y entre t&0..'0, pour y(t&0$&'"
>>> from scipy.inte)rate import odeint
>>> def rhs(y, t$: -second mem"re de l'e*ua diff
... return .(<y
...
>>> t & np.linspace(0, '0, '00$
>>> y & odeint(rhs, ', t$ - solution
Optimisation et !it : scipy.optimiCe
In [,0]: plot(mean9distance$
In [,']: t & np.aran)e(tma$
In [,(]: def f(2, y, $:
....: DDDla fonction E optimiserDDD
....: err & y . 2<np.s*rt($
....: return err
....:
In [,+]: coeff & scipy.optimiCe.leasts*(f, 0.!, ar)s&(mean9distance, t$$
In [,,]: coeff
In [,5]: coeff
>ut[,5]: ('.00'7+00505+,#'#5, +$
In [,#]: plot(t, coeff[0]<np.s*rt(t$, l8&($
%raitement &images : scipy.ndima)e
+e sous(module propose des routines de traitement d!images n dimensions &gnrique pour F(C,
H(C, etc"/"
*n e$emple
>>> import scipy.ndima)e
>>> lena & scipy.lena($
>>> lena9floue & scipy.ndima)e.)aussian9filter(lena, +$
>>> lena9rotated & scipy.ndima)e.rotate(lena, ,5$
suivant
prcdent |
Python scientifique
suivant
prcdent |
Python scientifique
'alcul symbolique avec sympy
+alcul symbolique
Lors de la manipulation de mod%les mathmatiques ou physiques, on a souvent besoin de faire des
calculs analytiques sur des variables symboliques &reprsentant des coordonnes, la temprature, le
temps, etc"/" #l s!agit de calcul !ormel &sur des symboles/, par opposition au calcul numrique oI on
ne manipule que des nombres"
#l e$iste plusieurs logiciels tr%s performants de calcul formel, les plus connus tant .aple ou
.athematica" .ais Python a galement un module de calcul formel, <<sympy<<"
Sympy
site ;eb http,,code"google"com,p,sympy,
tutoriel http,,docs"sympy"org,tutorial"html
(uelques exemples)))
*imites
>>> import sympy
>>> & sympy.Fym"ol(DD$
>>> sympy.limit(sympy.sin($A, , 0$
'
+retty print
In [']: sympy.pprint(sympy.Inte)ral(<<(, $$

(
d

Algbre linaire
>>> & sympy.Fym"ol(DD$
>>> y & sympy.Fym"ol(DyD$
>>> C & sympy.Fym"ol(DCD$
>>> m & sympy.Gatri([[', , <<(], [', y, y<<(], [', C, C<<(]]$
>>> m
[', , <<(]
[', y, y<<(]
[', C, C<<(]
>>> m.det($
<y<<( 1 y<C<<( 1 C<<<( . <C<<( . y<<<( . C<y<<(
suivant
prcdent |
Python scientifique
suivant
prcdent |
Python scientifique
,solution &quations i!!rentielles
Simulations numriques et quations diffrentielles
7eaucoup de travau$ de recherche ncessitent de rsoudre des syst%mes dynamiques ou d!autres
quations diffrentielles quation de )avier(StoEes, de +ahn(8illiard"
,solution &quations i!!rentielles orinaires
Cans scipy, on trouve un solveur d!quations diffrentielles ordinaires,
scipy.inte)rate.odeint" #l s!agit d!un solveur gnrique asseG sophistiqu, adapt pour les
probl%mes raides &stiff en anglais/ ou non raides" odeint rsout des syst%mes d!5CB du premier
ordre de la forme
dy'Adt & rhs'(y', y(, .., t0,...$
dy(Adt & rhs((y', y(, .., t0,...$
"""
B$emple rsolvons l!5CB dyAdt & .(y entre t&0..'0, pour y(t&0$&'"
>>> from scipy.inte)rate import odeint
>>> def rhs(y, t$: -second mem"re de l'e*ua diff
... return .(<y
...
>>> t & np.linspace(0, '0, '00$
>>> y & odeint(rhs, ', t$ - solution
B$emple oscillation amortie d!une masse au bout d!un ressort &5CB du F% ordre/
La position de la masse obit l!5CB y'' 1 nu y' 1 omH( y & 0, que l!on peut
transformer en un syst%me de deu$ quations diffrentielles du premier ordre, en rsolvant pour le
vecteur I&(y, y'$"
>>> def rhs(y,t, om, nu$:
... return (y['], .om<<(<y[0] . nu<y[']$
...
>>> y & odeint(rhs, (', 0$, t, ar)s&(+, '$$ - ar)s correspond E (om,nu$
Equations aux rives partielles
-olumes !inis

Le module !ipy est prvu pour faire des simulations d!BCP avec des mthodes de volumes finis
&http,,;;;"ctcms"nist"gov,fipy,/"
Elements !inis
.odule sfepy, http,,code"google"com,p,sfepy,


suivant
prcdent |
Python scientifique
suivant
prcdent |
Python scientifique
,seaux. arbres
scipy)spatial : implmentation e /- tree
In [(,]: import scipy,
scipy.spatial
In [(5]: import numpy as np
In [(!]: points & np.random.random(((, '00$$
In [(7]: plot(points[0], points['], 'o='$
>ut[(7]: [<matplotli".lines.?ine(@ o"%ect at 07"f5f(c>]
In [+0]: tree & scipy.spatial.J@Kree(points.K$
In [+']: indices & tree.*uery9"all9point((0.5, 0.5$, 0.'$
In [+(]: plot([0.5], [0.5], 'or', ms&'0$
>ut[+(]: [<matplotli".lines.?ine(@ o"%ect at 07fe#!,c>]
In [++]: plot(points[0,indices], points[', indices], 'oc'$
>ut[++]: [<matplotli".lines.?ine(@ o"%ect at 07d!#a,c>]
In [+,]: results & tree.*uery(tree.data, =&,$
In [+5]: [plot(points[0, l], points[', l], 'oy'$ for l in
results['][::,0]]
0et1or/x
net8or=L est un module Python optimis pour dcrire, reprsenter et tudier les graphes"

*n petit e$emple trouver le chemin le plus court pour relier Paris 6ustin en avion
In ['7]: import net8or= as ML
In [(0]: N & ML.LNraph($
In [(']: N.add9ed)es9from((('Oaris', '@allas', '0$, ('@allas', '2ustin',
'$, ('Oaris', 'MI', 7$, ('MI', '@allas', 5$$$
In [((]: ML.di%=stra9path(N, 'Oaris', '2ustin'$
>ut[((]: ['Oaris', '@allas', '2ustin']
In [(+]: ML.dra89)raph0iC(N, pro)&'fdp'$

suivant
prcdent |
Python scientifique
suivant
prcdent |
Python scientifique
,alisation &inter!aces graphiques
Plusieurs modules permettent de raliser des interfaces graphiques, notamment le module
Kraits5I"

L!acc%s graphique un ob1et peut se faire de mani%re tr%s transparente"
from enthou)ht.traits.api import <
from enthou)ht.traits.ui.api import <
class Pamera(QasKraits$:
)ain & Rnum(', (, +, $
eposure & PInt('0,
la"el&DRposureD, $
class Ket@isplay(QasKraits$:
strin) & Ftrin)($
0ie8& 6ie8( Item('strin)', sho89la"el&:alse,
sprin)y&Krue, style&'custom'$$
class Pontainer(QasKraits$:
camera & Instance(Pamera$
display & Instance(Ket@isplay$
0ie8 & 6ie8
(Item('camera', style&'custom', sho89la"el&:alse, $,
Item('display', style&'custom', sho89la"el&:alse,$, $
container & Pontainer(camera&Pamera($, display&Ket@isplay($$
container.confi)ure9traits($

*n tutoriel pour raliser des interfaces graphiques se trouve sur http,,gael(
varoquau$"info,computers,traitsJtutorial
suivant
prcdent |
Python scientifique
suivant
prcdent |
Python scientifique
+ython et la per!ormance
2ien utiliser +ython et 0umpy
Cu code crit avec un langage interprt s!e$cute plus lentement que du code compil"""
+ependant, les routines de )umpy pour manipuler les tableau$ de donnes sont crites dans des
langages compils &+ ou Kortran/, et donc aussi efficaces que si on les crivait dans ces langages" #l
faut donc utiliser au ma$imum les tableau$ )umpy, et pas les boucles for 22
+alcul numrique classique = boucles
def s*uare(data$:
for i in ran)e(len(data$$:
data[i] & data[i]<<(
return data
In [']: Stimeit data & ran)e('000$ 3 s*uare(data$
'000 loops, "est of +: +', us per loop
+alcul vectoriel remplacer les boucles par des oprations sur des tableau$
def s*uare(data$:
return data<<(
In [(]: Stimeit data&np.aran)e('000$ 3 s*uare(data$
'00000 loops, "est of +: '0.# us per loop
Appeler es langages compils
Pour crer une 6P# Python un code Kortran, on peut le compiler avec f(py"
.odule ctype appeler des biblioth%ques + dans Python"
.odule scipy.8ea0e mettre des bouts de code +-- directement dans le code Python"
Python mlanger code + et code Python"

Encore plus e per!ormance)))


Programmation sur carte graphique Pycuda http,,mathema"tician"de,soft;are,pycuda
.odules pour le calcul parall%le &5pen.P et .P#/
suivant
prcdent |
Python scientifique
prcdent
Python scientifique
'onclusion
'omment installer 3+ython scienti!ique4 5
Si vous travailleG sous Linu$ &par e$emple *buntu/
bonne nouvelle le langage Python est d1 install 2
pour les modules scientifiques de base installer les pacEages ipython,
python.numpy, python.scipy, python.matplotli",
maya0i("
beaucoup d!autres modules scientifiques sont galement des pacEages
d!*buntu python.sympy, python.net8or=, python.
ta"les, &python.d%an)o 2/
les autres pacEages doivent Ltre installs MmanuellementN"
Si vous travailleG sous 4indo;s ou .ac 5s
Python et ses modules scientifiques e$istant pour 4indo;s &et .ac/,
vous pouveG donc les installer un par un &non recommand/
#l e$iste des suites comprenant Python et ses modules scientifiques,
qu!on peut installer en une seule fois
l!Bnthought Python Cistribution
&http,,;;;"enthought"com,products,epd"php/,
distribue par l!entreprise Bnthought qu supervise le
dveloppement de )umpy et Scipy" La suite est
gratuite pour les utilisations acadmiques, mais
payante pour les entreprises"
Python&$,y/
&http,,;;;"python$y"com,do;nloadJfr"php/, suite
libre et gratuite"
Les deu$ suites e$istent galement pour Linu$, cela peut(Ltre utile pour installer Python scientifique
par e$emple sur un cluster qu!on ne veut pas mettre sur le rseau"
+our commencer http,,;;;"daEarlug"org,pat,scientifique,html
prcdent
Python scientifique