1
Python:
Application
au calcul
scientifique
Part I
S.DARRAGI
Plan
2
o Introduction
o Bibliothèque numpy
o Classe Ndarray, array
o Opérations élémentaires
o Slicing
o Algèbre linéaire
IPEST S.Darragi
Introduction
3
La distribution standard de Python contient un
certain nombre de bibliothèques qui ont été
considérées comme suffisamment génériques pour
intéresser la majorité des utilisateurs (os, sys,
math, mathc, random, Tkinter……) leur utilisation
est relativement bien expliquée dans la
documentation de la distribution du language.
Cependant, Python offre une panoplie de
bibliothèques offrant des couches supplémentaires
très utiles dans différents domaines d’application
Nous nous intéressons en particulier aux
bibiothèque numpy, scipy et matplotlib
IPEST S.Darragi
Introduction
4
Numpy & scipy : bibliothèques spécifiques pour
le calcul scientifique : Interpolation,
intégration (ODE integrators), algèbre linéaire,
Interpolation, systèmes dynamiques…
Pour plus d’info consulter
http://www.numpy.org/
http://www.scipy.org/
Matplotlib : bibliothèque de dessin de courbe
2D/3D (très riche)
http://matplotlib.sourceforge.net/
IPEST S.Darragi
Bibliothèque Numpy
5
• Python ne propose de base que le type
list, conteneur dynamique hétérogène
puissant, mais non orienté calcul
numérique!!
• Le module numpy propose un ensemble de
classes, d’objets et de fonctions dédiés
aux calculs numériques.
• La classe ndarray (N dimensional array):
tableaux homogènes multi-dimensionnels,
IPEST S.Darragi
Bibliothèque Numpy
6
Le module numpy offre également un
ensemble de sous bibliothèques dédiées:
numpy.linalg: un module d’algèbre linéaire
basique,
numpy.random: un module pour les
générateurs aléatoires,
Numpy.fft: un module basique de calculs
de FFT (Fast Fourier Transform).
IPEST S.Darragi
Bibliothèque Numpy :
La classe Ndarray, array
7
>>> import numpy as np
>>> M=np.ndarray((2,2))#création de tableau (2,2) de valeurs
aléatoires par défaut réelles mais on peut changer à l’aide du
paramètre dtype !
>>> print(M) #Matrice de dimension 2X2 réelle
[[ 4.24510811e+175 1.66039110e+243]
[ 2.59345432e+161 1.96507163e-147]]
>>> M=np.ndarray((2,2), dtype=int) #Matrice de dimension 2X2 entière
>>> print(M)
[[ 46339264 1668181827]
[1852142689 1919906913]]
>>> np.empty((2,2))
array([[ 7.33986605e-294, 1.73591700e-297],
[ 7.34464436e-294, 7.34521778e-294]])
IPEST S.Darragi
Bibliothèque Numpy: La classe Ndarray, array
8
La fonction numpy.arange()
>>> m = np.arange(3, 15, 2)
>>> m array([ 3, 5, 7, 9, 11, 13])
>>> type(m)
numpy.ndarray
Attention à la différence entre range et arange:
array range
IPEST S.Darragi
Bibliothèque Numpy: La fonction array
9
La fonction array convertit un objet list en objet ndarray
bidimentionnel:
>>> m1 = np.array([1, 2, 3]) # print(m1) tableau à une
dimension
array([1, 2, 3])
>>> m2 = np.array([1, 2, 3], float) # print(m2)
# float, int bool...
array([ 1., 2., 3.])
>>> L2 = [4, 5, 6]
>>> m3 = np.array([[1, 2, 3],[4, 5, 6]]) # print(m3)
# liste de listes, matrice !!
array([[1, 2, 3], [4, 5, 6]])
Différence entre le type list et array ! !
10
Attention à la différence entre une liste et un array
Liste Array
Contenu hétérogène Contenu homogène
Taille illimité Taille prédéfinie
Mutable Mutable
Operateurs * et +
L=[1,2,4] T=np.array([1,2,4])
L*2 T*2
[1,2,4, 1,2,4] np.array([1,4,16])
L1=[4,7,1] T1=np.array([3,4,7])
L+L1 T+T1
[1,2,4,4,7,1]
IPEST S.Darragi np.array([4,6,11])
List VS array
11
Un tableau est directement créé à partir d’une
liste:
L=[2, 4,-1]
T=np.array(L)
La méthode tolist fait le travail inverse elle crée
un objet list, copie de l’objet ndarray :
>>> m3.tolist()
[[1, 2, 3],[4, 5, 6]]
IPEST S.Darragi
Bibliothèque Numpy :
La classe Ndarray:
12
attributs
>>> M = np.array([[1, 2, 3],[4, 5, 6]]) # une liste de listes donne une
matrice
>>> print(M)
[[1 2 3]
[4 5 6]]
>>> M.dtype # type des entrées de la matrice, ici desentiers
dtype(’int64’)
>>> M.shape # dimension de la matrice
(2, 3) # 2 lignes, 3 colonnes
>>> M.itemsize # taille des éléments en octets
8 # integer of 8 bytes (64 bits)
>>> M.size # nombre d’éléments
6
>>> m.ndim # nombre de dimensions (axes)
2
Bibliothèque Numpy
Autres générateurs de tableaux….
13
Les fonctions numpy zeros, ones, eye et diag :
>>> m1 = np.zeros(4) ;# print(m1), création de tableau de 0
[ 0., 0., 0., 0.]
>>> m2 = np.ones(3, bool) ; # print(m2)
[ True True True]
>>> np.eye(3); #matrice identité
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
>>> np.diag([3,2,8]) #matrice diagonale
array([[3, 0, 0],
[0, 2, 0],
[0, 0, 8]])
IPEST S.Darragi
Bibliothèque Numpy :
Autres générateurs de tableaux….
14
Les fonctions linspace, logspace créent des
vecteurs de float :
>>> np.linspace(0, 10, 5) # debut, fin, nombre de
points, trés utile pour le traçage des courbes
array([ 0., 2.5, 5., 7.5, 10.])
>>> np.logspace(1, 2, 4) # 4 points entre 10**1 et
10**2
array([ 10., 21.5443469, 46.41588834, 100.])
>>> np.logspace(1, 2, 4, base=2) # 4 points entre
2**1 et 2**2
array([ 2. , 2.5198421, 3.1748021, 4.])
IPEST S.Darragi
Array: accès à un élément
15
Même principe d’indexation que les listes !
>>> M=np.array([[2,4,5,11],[4,5,0,1]])
>>> M
array([[ 2, 4, 5, 11],
[ 4, 5, 0, 1]])
>>> M[1,1] #2eme ligne 2eme colonne
5
>>>N=np.array([1,3,6,3,4,8])
>>> N
array([1, 3, 6, 3, 4, 8])
>>> N[-1] #accés au dernier élément
8
>>> N[2]=5 #mutable !
>>> N
array([1, 3, 5, 3, 4, 8])
IPEST S.Darragi
Array, slicing
16
Il est possible de sélectionner une sous
matrice, en ne gardant que quelques lignes
consécutives et/ou certaines colonnes
consécutives
Si M est une matrice
M[:,:]: une copie intégrale de M avec nouvelle référence
M[:a,:b] : sous matrice les lignes du début jusqu’à < a >
exclu, colonne de début jusqu’à <b> exclu.
M[:,b] :colonne b +1
M[a,:] :ligne a +1
IPEST S.Darragi
Array, slicing: exemple
17
>>>M=np.array([[2,3,4],[1,1,0],[3,8,0]]
) >>> M[:,1:]
>>> M[:,:] array([[3, 4],
array([[2, 3, 4], [1, 0],
[1, 1, 0], [8, 0]])
[3, 8, 0]]) >>> M[:1,:]
>>> N=M[:,:] array([[2, 3, 4]])
>>> id(N),id(M) >>> M[:2,:]
(39025168, 39024064) array([[2, 3, 4],
>>> M[1:,2:] [1, 1, 0]])
array([[0], >>> M[1,:]
[0]]) array([1, 1, 0])
>>> M[1:,1:] >>> M[:,2]
array([[1, 0], array([4, 0, 0])
[8, 0]])
IPEST S.Darragi
Opérateurs vectorialisés
18
Quand les paramètres sont des tableaux numpy,
les opérations usuelles (+,-,*,**,/) sont effectuées
coefficient par coefficient !!
>>> a, b = np.array([1, 2, 3, 4]), np.array([2, 3, 4, 5])
>>> a+b
array([3, 5, 7, 9])
>>> a-b
array([-1, -1, -1, -1])
>>> a**2
array([ 1, 4, 9, 16])
>>> 4*a, a*4
(array([ 4, 8, 12, 16]), array([ 4, 8, 12, 16]))
IPEST S.Darragi
Opérateurs vectorialisés (suite)
19
>>> a*b
array([ 2, 6, 12, 20])
>>> A=np.array([a,b])
>>> A
array([[1, 2, 3, 4],
[2, 3, 4, 5]])
>>> A*A # * fait une multiplication terme à
terme
array([[ 1, 4, 9, 16],
[ 4, 9, 16, 25]])
IPEST S.Darragi
Autres méthodes...
20
Autres méthodes utiles de la classe ndarray :
>>> m = np.linspace(1,12,12).reshape((3,4));m
[[ 1. 2. 3. 4.]
[ 5. 6. 7. 8.]
[ 9. 10. 11. 12.]]
>>> m.sum(), m.min(), m.max() # somme, max, min
de tous les éléments
(78.0, 1.0, 12.)
>>> m.sum(axis=0) # somme des colonnes
array([ 15., 18., 21., 24.])
>>> m.min(axis=1) # min des lignes
array([ 1., 2., 3., 4.])
IPEST S.Darragi
21
import numpy as np
>>> M=np.arange(1,20,2)
>>> M
array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19])
>>> N= M.reshape((2,5)) #redimensionne la matrice M en 2 lignes 5
colonnes
array([[ 1, 3, 5, 7, 9],
[11, 13, 15, 17, 19]])
>>> N.sum()
100
>>> N.sum(axis=0) #somme des colonnes
array([12, 16, 20, 24, 28], dtype=int32)
>>> N.sum(axis=1) #somme de lignes
array([25, 75], dtype=int32)
IPEST S.Darragi
Les ufunc….
22
Les ufunc sont des fonctions mathématiques courantes
(sin, cos, exp...) : (fonctios universelles)
1. qui s’appliquent à tous les éléments d’un objet ndarray,
2. qui renvoient l’objet ndarray résultant
>>> m = np.linspace(1,6,6).reshape((2,3)); print m
[[ 1. 2. 3.]
[ 4. 5. 6.]]
>>> s = np.sqrt(m);
array([[ 1. , 1.41421356, 1.73205081],
[ 2. , 2.23606798, 2.44948974]])
>>> np.exp(m)
array([[ 2.71828183, 7.3890561 , 20.08553692],
[ 54.59815003, 148.4131591 , 403.42879349]])
IPEST S.Darragi
Algebre linéaire avec numpy.linalg
23
A vous de jouer
np.dot(M,N): multiplication matricielle
np.inner (M,scalaire) : multiplie une matrice par un
scalaire
np.diag ([liste_elt]) : crée une matrice diagonale
à partir d’une liste
np.transpose (M): donne la matrice transposée
IPEST S.Darragi
numpy.linalg
24
np.linalg.det(M): déterminant de la matrice
>>> a = np.array([[1, 2], [3, 4]])
>>> np.linalg.det(a) -2.0
np.linalg.inv(M) : inverse de la matrice
>>> a = np.array([[1, 3, 3], [1, 4, 3], [1, 3, 4]])
>>> np.linalg.inv(a) array([[ 7., -3., -3.], [-1., 1., 0.],
[-1., 0., 1.]])
np.linalg.solve(A,B) résolution du système linéaire
de type A x = B
IPEST S.Darragi
Algèbre linéaire avec numpy
25
>>> A = np.array([[1,1],[0,1]]);
>>> B = np.array([[2,0],[3,4]])
>>> np.dot(A,B) # produit matriciel
array([[5, 4],
[3, 4]])
>>> a, b = np.array([1,2,3]), np.array([0,1,0])
# 2 vectors
>>> np.dot(a,b)
2
>>> a, b = np.array([1,2,3]), np.array([0,1,1])
>>> np.dot(a,b)
5
IPEST S.Darragi
Algèbre linéaire
26
avec numpy
>>> import numpy.linalg as npl
>>> npl.det(m)
-0.00981811548021
>>> np.transpose(m) # ne modifie pas m
array([[ 0.57401918, 0.02683847],
[ 0.64990241, 0.01328225]])
>>>IM = npl.inv(m); IM
[[ -1.35283131 66.19421103]
[ 2.73356598 -58.46531103]]
IPEST S.Darragi
Algèbre linéaire avec numpy
27
Matrices diagonales :
>>> np.diag(np.arange(3))
array([[0, 0, 0],
[0, 1, 0],
[0, 0, 2]])
>>> np.diag(np.arange(1,3),1)
array([[0, 1, 0],
[0, 0, 2],
[0, 0, 0]])
>>> np.diag(np.arange(1,3),-1)
array([[0, 0, 0],
[1, 0, 0],
[0, 2, 0]])
IPEST S.Darragi
Tableau aléatoire avec le module random de
numpy
28
>>> import numpy as np
>>> import numpy.linalg as npl
>>> import numpy.random as npr
>>> m = npr.random(9).reshape((3,3)); m
array([[ 0.73377208, 0.26787043, 0.63561671],
[ 0.9495004 , 0.73684802, 0.01673223],
[ 0.08534191, 0.77328228, 0.700254 ]])
>>> y = npr.random(3); y
array([ 0.92367858, 0.32060105, 0.64198517])
>>> x = npl.solve(m, y); x
array([ 0.42757753, -0.13899785, 1.01817263])
>>> np.dot(m, x)
array([ 0.92367858, 0.32060105, 0.64198517])
IPEST S.Darragi
Suite…
29
>>> import numpy as np
>>> import numpy.linalg as npl
>>> import numpy.random as npr
>>> m = npr.random(4).reshape((2,2)); m
array([[ 0.57401918, 0.64990241],
[ 0.02683847, 0.01328225]])
>>> npl.det(m)
-0.00981811548021
>>> npl.transpose(m) # ne modifie pas m
array([[ 0.57401918, 0.02683847],
[ 0.64990241, 0.01328225]])
>>> mi = npl.inv(m); print (mi)
[[ -1.35283131 66.19421103]
[ 2.73356598 -58.46531103]]
IPEST S.Darragi
Les fichiers images !!
30
Un fichier image est un tableau ndarray
import matplotlib.image as pltim
pic=pltim.imread("nom_image.png")
print(pic,type(pic))
IPEST S.Darragi
Les fichiers images !!
31
Un fichier image est un tableau ndarray
import matplotlib.image as pltim
pic=pltim.imread("nom_image.png")
print(pic,type(pic))
IPEST S.Darragi