Académique Documents
Professionnel Documents
Culture Documents
1
Ces modules fournissent un ensemble d’objets ainsi qu’un groupes de fonctions permettant de manipuler
nombre d’objets de façon simple et très performantes dans le cadre du calcul scientifique.
1/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
Les fonctions de numpy sont alors accessibles par leur nom qualifié « np.nom_de_la_fonction ».
Important : dans toute la suite, on supposera que le module numpy a été importé de cette manière.
Quand on évoquera la fonction « array » par exemple, on pensera toujours à l’utiliser avec la syntaxe
« np.array »
Ces tableaux admettent quelques attributs: par exemple, les fonctions size et shape qui renvoient le
nombre d’éléments et la taille du tableau.
Exemple 1.2 :
>>> B = np.array( [[1,2,3] , [1,4,9]] );
>>> np.size(B)
6
2/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
>>> np.shape(B)
(2,3)
Remarques :
arange(a,b,inc) permet de créer un tableau 1d et fonctionne comme la fonction
range(a,b,inc) sauf que les arguments peuvent être des flottants :
>>> np.arange(0,1,0.1)
array([ 0. , 0.1 , 0.2 , 0.3 , 0.4 , 0.5 , 0.6 , 0.7 , 0.8 , 0.9])
La méthode reshape permet de modifier la taille d’un tableau sous la contrainte que le
nombre total d’éléments doit rester constant. On pourra ainsi passer (dans les deux sens) d’un
vecteur de taille n à une matrice de taille (p; q) ou à une matrice de taille (r; s) à condition
que n = pq = rs.
>>> np.arange(0,1,0.1).reshape(2,5)
array([[ 0. , 0.1 , 0.2 , 0.3 , 0.4] ,
[0.5 , 0.6 , 0.7 , 0.8 , 0.9]])
>>> np.identity(4)
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
3/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
La fonction diag, si elle est appliquée à un vecteur (ou à une liste, ou à un tuple) renvoie la matrice
diagonale formée sur les coefficients de ce vecteur
Exemple 1.6 :
>>> np.diag(np.ones(3))
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
Exemple 1.7 :
>>> A = np.array([[1,2,3],[4,5,6],[7,8,9]]) # un tableau 2d
>>> A
array( [ [ 1 , 2 , 3 ],
[ 4 , 5 , 6 ],
[ 7 , 8 , 9 ] ])
>>> np.diag(A) # extraction de la diagonale principale
array([1, 5, 9])
4/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
>>> v = np.array(range(0,160,10))
>>> v
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150])
>>> v[0] # le 1er élément
0
>>> v[-1] # le dernier élément
150
>>> v[4 :11] # de v[4] à v[10]
array([40, 50, 60, 70,80, 90, 100])
>>> v[ 11 : 4 : -1 ] # de v[11] à v[5], donc |4-11| = 7 éléments
array([110, 100, 90, 80, 70, 60, 50])
>>> v[ : 6 : -1 ] # de v[15] à v[7], donc |6-15| = 9 éléments
array([150, 140, 130, 120, 110, 100, 90, 80, 70])
>>> v[ 6 : : -1 ] # de v[6] à v[0], donc 7 éléments
array([60, 50, 40, 30, 20, 10, 0])
5/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
Remarques:
Comme les listes, les matrices sont des objets mutables.
>>> A=np.array([[ 1, 1],[-1, 0]])
>>> B=A
>>> A[1,1]=2
>>> A
array([[ 1, 1],
[-1, 2]])
>>> B
array([[ 1, 1],
[-1, 2]])
Pour éliminer ce problème, il faut faire une copie de la matrice A :
>>> A=np.array([[ 1, 1],[-1, 0]])
>>> B=np.array(A,copy=True)
>>> A[1,1]=2
>>> A
array([[ 1, 1],
[-1, 2]])
>>> B
array([[ 1, 1],
[-1, 0]])
6/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
>>> s-t
array([[-1, -2, 4],
[ 2, 1, 0]])
>>> s*t
array([[ 0, 0, 21],
[24, 30, 36]])
>>> s**2
array([[ 0, 0, 49],
[36, 36, 36]])
7/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
Exemple 1.12 :
>>> np.linalg.det ( [ [1 , 2] , [3 , 4] ] )
-2.0000000000000004
8/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
>>> np.linalg.solve( a , b )
array([ 4., -1.])
9/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
Le module matplotlib est chargé de tracer les courbes. Dans toute la suite on supposera qu’on a
effectué :
>>> import matplotlib.pyplot as plt
Les instructions :
>>> plt.plot ([x0, . . . , xn], [y0, . . . , yn])
>>> plt.show () # provoque l’affichage
permettent de tracer une ligne brisée reliant les points de coordonnées (xk, yk). Les listes de
coordonnées peuvent aussi être données sous forme de tableaux numpy.
Quoi Comment
Tracer une ligne brisée plt.plot([x0,...,xn] , [y0...,yn])
Mettre des titres/noms aux axes plt.title(’Titre de la figure’)
plt.xlabel(’Nom de l’axe des x’)
plt.ylabel(’Nom de l’axe des y’)
Visualiser le résultat plt.show( )
Effacer la fenêtre graphique courante plt.clf( )
Sauver la figure plt.save(’courbe.bmp’)
(sous différents formats !) plt.savefig(’courbe.pdf’)
10/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
Remarques :
1. linspace(a,b,n) permet de créer un tableau 1d dont les n composantes sont uniformément
réparties entre a et b :
>>> np.linspace( 0 , 1 , 5 ) # vecteur à 5 composantes équiréparties entre 0 et 1
array([ 0. , 0.25 , 0.5 , 0.75 , 1. ])
2. numpy permet de “vectoriser”, i.e. appliquer une fonction à un vecteur/matrice et éviter les
boucles. Comme nous avons choisi d’utiliser numpy à travers import numpy as np, il faut
choisir les fonctions usuelles définies dans numpy. Par exemple :
>>> from math import sin
>>> a=np.arange( 4, dtype=float)
>>> a
array([ 0., 1., 2., 3.])
>>> sin(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: only length-1 arrays can be converted to Python scalars
>>> np.sin(a)
array([ 0. , 0.84147098 , 0.90929743 , 0.14112001 ])
11/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
plt.plot(x, y)
plt.grid() # décoration : pour créer une grille
plt.title('Le graphe de $f$') # Le titre
plt.xlabel('$x$') # le nom de l'axe horizontal
plt.ylabel('$y=f(x)$')
plt.axhline(color='black') #equivalent a linewidth=1, color='k')
plt.axvline(color='black')
plt.savefig('courbe1.pdf') # pour sauver (en pdf ou autre)
plt.show() # l’affichage se fait après la sauvegarde !
3. Le module scipy :
Le module scipy est la boîte à outils numérique (librairie de calcul scientifique) pour les tableaux
numpy. On trouve dans scipy les opérations de manipulation / traitement de données numériques
classiques, mais spécifiques à un type d’application (algèbre linéaire, statistiques, etc.).
12/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
Elle retourne un couple constitué de la valeur approchée de l'intégrale (1er élément) et d'une
estimation de l'erreur commise. Pour accéder indépendamment à ces 2 valeurs :
>>> res = integrate.quad(f,0,1)
>>> res[0] # Résultat obtenu
0.33333333333333337
>>> res[1] # Estimation de l'erreur
3.700743415417189e-15
Remarque :
D'autres méthodes, par exemple pour le calcul d'intégrales doubles ou multiples sont disponibles
dans scipy. (voir : http://docs.scipy.org/doc/scipy/reference/integrate.html)
Le principe d’utilisation de odeint (pour intégrer numériquement des équations différentielles) est le
suivant : pour avoir une estimation numérique de la solution du problème : y '(t) f y(t),t sur un
intervalle [t0 , tf]. Il faut définir :
La variable ‘t’ est de la forme t=[ t0,t1,..., tf].
La condition initiale est alors : y(t0) = y0.
La valeur renvoyée est un tableau contenant une estimation de la solution aux différents temps.
Une fois définies, on peut utiliser odeint:
>>>yt = odeint(f, y0, t)
Exemple 3.1 :
Prenons l'exemple de l'intégration sur [-1; 1] de l'équation différentielle : y’ = t avec y(-1) = 1/2.
dont l'unique solution est y(t) = t2/ 2
.
>>> t = np.linspace(-1,1,100)
>>> f = lambda y, t : t
13/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
>>> y0 = 1/2.
>>> y = odeint(f, y0, t)
>>> plt.plot(t,y)
>>> plt.grid()
>>> plt.show()
Prenons l'exemple de l'intégration sur [0; 4] de l'équation différentielle : y ' y avec y(0) = 1.
14/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
4. Trouver de l’aide :
Plusieurs méthodes existent pour trouver de la documentation sur les fonctions cherchées:
Sur internet: http://numpy.org et http://scipy.org peuvent être de bons points de départ.
Voir aussi http://docs.scipy.org
Via help(): Comme d’habitude, toutes les aides internes aux fonctions et objets manipulés
sont disponibles via la commande help( ), par exemple help(np.linalg.inv) .
Via np.info(): a le même comportement que help(), par exemple np.info(np.linalg.det)
Via np.source(): Permet de regarder le code source d’une fonction donnée. Particulièrement
utile pour comparer et comprendre l’implémentation des différents algorithmes.
Par exemple :
>>> import numpy as np
>>> np.source(np.linalg.inv)
In file: C:\pyzo2013b\Lib\pyzo-packages\numpy\linalg\linalg.py
def inv(a):
"""
Compute the (multiplicative) inverse of a matrix.
Parameters
----------
a : (M, M) array_like
Matrix to be inverted.
Returns
-------
ainv : (M, M) ndarray or matrix
(Multiplicative) inverse of the matrix `a`.
Raises
------
LinAlgError
If `a` is singular or not square.
Examples
15/16
Ingénierie numérique et simulation Numpy, Scipy et Matplotlib
--------
>>> from numpy import linalg as LA
>>> a = np.array([[1., 2.], [3., 4.]])
>>> ainv = LA.inv(a)
>>> np.allclose(np.dot(a, ainv), np.eye(2))
True
>>> np.allclose(np.dot(ainv, a), np.eye(2))
True
"""
a, wrap = _makearray(a)
return wrap(solve(a, identity(a.shape[0], dtype=a.dtype)))
16/16