Académique Documents
Professionnel Documents
Culture Documents
Mirco Ciallella
1/97
Introduction
Pourquoi python ?
2/97
Présentation de python
Python est un langage interprété
$ python3
Python 3.6.9 (default, Oct 8 2020, 12:12:24)
[GCC 8.4.0] on linux
Type "help" , "copyright" , "credits" or "license" for more information.
>>> print("Hello world" )
Hello world
>>> 3 + 5
8
>>>
Dans un langage à typage statique comme le C, une variable est définie avec
un type qui ne peut pas changer dans la portée courante.
4/97
Présentation de python
Typage dynamique de python
a = 3 # So a will be an integer
b = 4 # b too
x = 32.5 # x will be a float
a = b # OK
print("a =", a)
5/97
Présentation de python
Typage dynamique de python
Cela permet une grande flexibilité mais peut aussi causer beaucoup de
problèmes !
On peut trouver le type d’une variable avec type() :
i = 2
print(type(i))
x = 3.0
print(type(x))
s = "Hello"
print(type(s))
s = i
print(type(s))
Output :
6/97
Présentation de python
Typage dynamique de python
a = 3
print(type(a) is int)
print(isinstance(a, int))
if type(a) is float:
print("a is float")
if isinstance(a, int):
print("a is int")
Output :
True
True
a is int
7/97
Les bases de la sytaxe en python
Indentation obligatoires entre les blocs
int a = 1;
int b = 1;
int c;
if(a == 1){
if(b == 1)
{
c = 1;
}
else
{
c = 1000;
b = 1000;
}
}
printf("a = %d, b = %d, c = %d\n", a, b, c);
Output :
a = 1, b = 1, c = 1
8/97
Les bases de la sytaxe en python
Indentation obligatoires entre les blocs
et
int a = 1;
int b = 1;
int c;
if(a == 1){
if(b == 1){
c = 1;
}
else{
c = 1000;
b = 1000;
}
}
printf("a = %d, b = %d, c = %d\n", a, b, c);
Output :
a = 1, b = 1, c = 1
9/97
Les bases de la sytaxe en python
Indentation obligatoires entre les blocs
a = 1
b = 1
if a == 1:
if b == 1:
c = 1
else:
c = 1000
b = 1000
print("a =", a, "b =", b, "c =", c) # on peut mettre print("a"); print("b");
Output :
a = 1 b = 1 c = 1
10/97
Les bases de la sytaxe en python
Indentation obligatoires entre les blocs
a = 1
b = 1
if a == 1:
if b == 1:
c = 1
else:
c = 1000
b = 1000 # Go back in the first if and erase b
print("a =", a, "b =", b, "c =", c) # on peut mettre print("a"); print("b");
Output :
a = 1 b = 1000 c = 1
11/97
Les bases de la sytaxe en python
Commentaires
On peut commenter :
la fin d’une ligne à partir du symbole #
plusieurs lignes en les encadrant de ”””
print("1")
# print("2")
print("3")
"""
print("4")
print("5")
"""
print("6")
Output :
1
3
6
12/97
Types de base
Les chaı̂nes de caractères
Output :
Tony Stark
13/97
Types de base
Les chaı̂nes de caractères
s1 = "Hello"
s2 = "every one"
final_string = s1 + " " + s2
print(final_string)
Output :
14/97
Types de base
Les chaı̂nes de caractères
Output :
Tony
Stark
Frank
Castle
15/97
Types de base
Les chaı̂nes de caractères
i = 32
print("La valeur est " + str(i))
# print("La valeur est " + i) # TypeError: must be str, not int
Output :
La valeur est 32
16/97
Types de base
Les chaı̂nes de caractères
trente_deux = "32"
v = int(trente_deux)
print(trente_deux)
print(v * 10)
Output :
32
320
17/97
Types de base
Les chaı̂nes de caractères
Output :
18/97
Types de base
Les chaı̂nes de caractères
print("eirb" in "enseirb-matmeca")
print("herbe" in "enseirb-matmeca")
Output :
True
False
19/97
Types de base
Formater les chaı̂nes de caractères
Quand on veut écrire les valeurs des variables, plutôt qu’ecrir ça
a = 2
b = 3
print("The sum of " + str(a) + " and " + str(b) + " equals " + str(a + b))
a = 2
b = 3
print("The sum of ", a, " and ", b, " equals ", a + b)
Output :
20/97
Types de base
Formater les chaı̂nes de caractères
On peut écrire la chaı̂ne directement en remplaçant les variables par des {},
puis en les insérant avec .format(var1, var2, . . .)
a = 2
b = 3
print("The sum of {} and {} equals {}".format(a, b, a + b))
Encore mieux, depuis python 3.6, on peut utiliser une syntaxe plus concise
appelée f-string
a = 2
b = 3
print(f"The sum of {a} and {b} equals {a + b}")
Output :
21/97
Types de base
Liste
Le type python ”liste” est une liste avec laquelle on peut accéder aux
éléments comme un tableau.
On déclare une liste avec [], et on sépare les éléments par ,.
On accède à l’élement numéro i avec l’opérateur [i]. Une liste de n
éléments est indexée de 0 à n − 1.
Output :
Earth
Air
<class 'list' >
22/97
Types de base
Liste
On peut utiliser des indices négatifs pour accéder aux éléments depuis la
fin
len donne la taille de la list
l’indice l[−k] est alors un raccourcis pour l[len(l) − k]
On peut rajouter un élément à la liste avec append
On peut supprimer un élément avec le mot clé del et l’indice de l’élément
à supprimer
On peut boucler sur les éléments d’une liste avec la boucle for et le mot
clé in
23/97
Types de base
Liste
Fire
Fire
Air
['Earth' , 'Water' , 'Air' , 'Fire' ]
['Earth' , 'Water' , 'Air' , 'Fire' , '5th element' ]
['Earth' , 'Water' , 'Fire' , '5th element' ]
Earth
Water
Fire
5th element
24/97
Types de base
Dictionnaire
Les dictionnaires en python sont des tables, qui associent à une clé une valeur.
La syntaxe pour définir un dictionnaire est {}. On peut insérer un élément de
clé k ou y accèder avec [k].
Output :
25/97
Types de base
Dictionnaire
my_dict = { 12 : "douze",
"Hello" : "Goodbye",
"A list" : [1, 2, 3] }
print(my_dict)
del my_dict["Hello"]
print(my_dict)
Output :
26/97
Opérations de base de python
Boucles for avec range
# incrément positif
for i in range(3, 19, 4): # range(begin, end, step)
print(i)
# Le step peut ^
etre négatif
for i in range(10, 6, -1):
print(i)
3
7
11
15
10
9
8
7
27/97
Opérations de base de python
Boucles for avec range
print(list(range(4)))
print(list(range(10, 15)))
Output :
[0, 1, 2, 3]
[10, 11, 12, 13, 14]
28/97
Opérations de base de python
Boucle while
La boucle ”tant que” se répète jusqu’à ce que la condition donnée soit fausse.
k = 0
while k < 3:
print(k)
k = k + 1 # Infinite loop if forgotten...
Output :
0
1
2
Il faut préférer les boucles for en général, qui sont plus lisibles et diminuent
les chances de faire des boucles infinies.
29/97
Opérations de base de python
Utilisation avancée des boucles
On peut générer des listes directement avec des boucles dans [].
Par exemple les 10 premiers nombres carrés.
Output :
Il existe deux mots clés qu’on peut utiliser à l’intérieur d’une boucle pour
changer son déroulement :
break permet une sortie immédiate de la boucle
continue permet de passer à l’itération suivante
30/97
Opérations de base de python
If elif else
Une condition s’exprime avec if. Puis on peut la faire suivre avec des elif et
éventuellement finir par un else.
Output :
i = 3
7
11
i divisible par 3
31/97
Opérations de base de python
If elif else
Output :
2 in a
a[1] is 2
a[1] is not 3 32/97
Opérations de base de python
Les fonctions
Le mot clé pour écrire une fonction est def, suivi du nom de la fonction et des
arguments entre parenthèse.
La fonction est ensuite définie dans le bloc commencé par def.
def write_hello():
print("Hello")
write_hello()
def write_hello_to(name):
print("Hello " + name)
write_hello_to("George")
Output :
Hello
Hello George
33/97
Opérations de base de python
Les fonctions
print(divide(10, 5))
print(divide(10.0, 9.0))
help(divide) # Or print(divide.__doc__)
Output :
2
1.0
Help on function divide in module __main__:
divide(a, b)
Divide a by b and return the quotient
a -- dividend
b -- divisor 34/97
Opérations de base de python
Fonction récusive
def fibo(n):
"""Returns n-th term of the Fibonacci sequence"""
if n < 2:
return 1
else:
return fibo(n - 2) + fibo(n - 1)
for i in range(10):
print(f"Fibonacci number {i} is {fibo(i)}")
Fibonacci number 0 is 1
Fibonacci number 1 is 1
Fibonacci number 2 is 2
Fibonacci number 3 is 3
Fibonacci number 4 is 5
Fibonacci number 5 is 8
Fibonacci number 6 is 13
Fibonacci number 7 is 21
Fibonacci number 8 is 34
Fibonacci number 9 is 55
35/97
Opérations de base de python
Paramètres par défaut
On peut nommer les paramètres et leur donner une valeur par défaut. Cela
peut permettre plus de flexibilité et de lisibilité.
On va écrire une version différente de notre fonction de Fibonacci en
proposant de paramétrer les valeurs de F0 et F1 .
fnm2 = f0
fnm1 = f1
for i in range (1, n):
fn = fnm2 + fnm1
fnm2 = fnm1
fnm1 = fn
return fn
36/97
Opérations de base de python
Valeurs retournées multiples
import numpy as np
x, y = 1.33, 4.25
r, theta = cart_to_polar(x, y)
print("x, y", x, y)
print("r, theta", r, theta)
x, y 1.33 4.25
r, theta 4.45324600713 1.26750958302
37/97
Opérations de base de python
Utilisation avancée des fonctions
Définir une fonction locale dans une fonction (une lambda fonction).
def compute_fib_seq(n):
"""Compute the fibonacci sequence up to number n"""
f = [1, 1]
def next_fib(fib):
"""Add the two last values of the list fib and retuns it"""
f_m2 = fib[-2]
f_m1 = fib[-1]
return f_m2 + f_m1
for i in range(n-2):
f.append(next_fib(f))
return f
print(compute_fib_seq(7))
# next_fib cannot be called here
[1, 1, 2, 3, 5, 8, 13]
Cette fonction ne peut pas être appelée en dehors de la fonction mère. 38/97
Opérations de base de python
Modularité
# mymodule.py
hello = "Hello wolrd"
constant = 23
def print_something():
print("something")
import mymodule
print(mymodule.hello)
print(mymodule.constant)
mymodule.print_something()
Output :
Hello wolrd
23
something 39/97
Opérations de base de python
Exercice
# range
start = 25
end = 50
Output :
40/97
Opérations de base de python
Exercice
start = 25
end = 50
print("Prime numbers between", start, "and", end, "are:")
41/97
Lecture et écriture de fichier
L’ouverture d’un fichier se fait avec open, qui prend en paramètre le nom du
fichier à ouvrir et le mode d’ouverture :
42/97
Lecture et écriture de fichier
Pour écrire une chaı̂ne de caractères dans le fichier, on peut utiliser write.
Pour lire une ligne, on peut utiliser readline.
f = open("file.txt", "w")
f.write("One\n") # utiliser \n pour sauter une ligne
f.write("Two")
line = f.readline()
print(line)
f.close()
Output :
One
Two
43/97
Algèbre
Nombres complexes
Output :
z (2+1j)
True
x + z (4+2j)
x - z 0j
xz (3+4j)
44/97
Algèbre
Nombres complexes
z = complex(2, 1)
print("Real part is :", z.real)
print("Imaginary part is :", z.imag)
Output :
45/97
Algèbre
Numpy
import numpy as np
Pour plus de lisibilité, cette ligne ne sera plus écrite au début de chaque
exemple, mais bien présente néanmoins.
46/97
Algèbre
Array numpy
Les tableaux numpy sont des ”vrais” tableaux : tous les éléments ont le même
type, on peut accéder à un élement avec [] comme pour la liste.
L’avantage majeur de ces tableaux est qu’ils permettent de faire des
opérations vectorisées et optimisées qui s’approchent des performances qu’on
pourrait attendre d’un code compilé.
import numpy as np
t = np.array([1, 2, 3]) # Create numpy array from python list
print(t)
print(type(t))
Output :
[1 2 3]
<class 'numpy.ndarray' >
47/97
Algèbre
Array numpy : tableaux
Output :
Il existe une multitude d’autres fonctions pour générer des tableaux. On peut
noter arange, l’équivalent de range, mais qui fonctionne aussi avec des
nombres réels
Output :
[0 1 2 3]
[ 1.5 2.5 3.5 4.5 5.5]
[ 1.5 2. 2.5 3. 3.5 4. 4.5]
49/97
Algèbre
Array numpy : tableaux
Tous les éléments d’un tableau ont le même type. On peut le retrouver avec la
syntaxe .dtype
a = np.arange(4)
print(a.dtype)
b = np.arange(4.0)
print(b.dtype)
Output :
int64
float64
50/97
Algèbre
Array numpy : tableaux
Il est parfois nécessaire de préciser le type que l’on veut utiliser. Sans rien
préciser, on peut avoir des surprises :
a = np.arange(4)
print(a)
print(a)
Output :
[0 1 2 3]
[0 0 1 1]
51/97
Algèbre
Array numpy : tableaux
print(a)
print(a.dtype)
Output :
[ 0. 1. 2. 3.]
[ 0. 0.5 1. 1.5]
float32
52/97
Algèbre
Array numpy : tableaux
53/97
Algèbre
Array numpy : tableaux
On ne peut pas changer le type d’un tableau, mais on peut facilement le copier
dans le bon type
ti = np.arange(3)
print(ti.dtype, ti)
tc = np.array(ti, dtype='c8')
print(tc.dtype, tc)
tb = np.array(ti, dtype='?')
print(tb.dtype, tb)
Output :
int64 [0 1 2]
complex64 [ 0.+0.j 1.+0.j 2.+0.j]
bool [False True True]
54/97
Algèbre
Opérations sur tout le tableau
a = np.arange(5, dtype='d')
print(a)
a /= 2 # Same thing
print(a)
Output :
[ 0. 1. 2. 3. 4.]
[ 0. 0.5 1. 1.5 2. ]
[ 0. 0.25 0.5 0.75 1. ]
55/97
Algèbre
Opérations sur tout le tableau
On peut faire des opérations terme à terme sur 2 tableaux de même taille
a = np.arange(5)
b = np.arange(0, 50, 10)
print(a)
print(b)
print(a + b)
Output :
[0 1 2 3 4]
[ 0 10 20 30 40]
[ 0 11 22 33 44]
56/97
Algèbre
Opérations sur tout le tableau
Enfin, on peut utiliser les tableaux comme des vecteurs. On peut par exemple
faire un produit scalaire avec .dot
a = np.arange(3.0)
b = np.arange(3.0, 6.0)
print(a)
print(b)
print(a.dot(b))
Output :
[ 0. 1. 2.]
[ 3. 4. 5.]
14.0
57/97
Algèbre
Nd-arrays
a = np.array([1, 2, 3])
print(a.shape)
print(type(a))
Output :
(3,)
<class 'numpy.ndarray' >
Remarque : pour une seule dimension, la shape d’un tableau de taille n est
noté (n,).
58/97
Algèbre
Nd-arrays
En plusieurs dimensions
Output :
[[ 1 2 3]
[-1 3 3]]
(2, 3)
[[[ 0. 0.]
[ 0. 0.]]
[[ 0. 0.]
[ 0. 0.]]
[[ 0. 0.]
[ 0. 0.]]]
(3, 2, 2) 59/97
Algèbre
Nd-arrays
Ou encore...
print(np.zeros((3,)), "\n") # 1D
print(np.ones((2, 2)), "\n") # 2D
print(np.full((3, 2, 2), 10), "\n") # 3D
#On peut toujours accéder à un élément avec [], mais il faut préciser chaque dimension.
a = np.ones((3, 2, 2))
print(a[2,0,1])
[ 0. 0. 0.]
[[ 1. 1.]
[ 1. 1.]]
[[[10 10]
[10 10]]
[[10 10]
[10 10]]
[[10 10]
[10 10]]]
1.0
60/97
Algèbre
Nd-arrays
a = np.arange(12.0)
a = a.reshape(3, 4)
print(a, '\n---\n')
a = a.reshape(3, 2, 2)
print(a)
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]
---
[[[ 0. 1.]
[ 2. 3.]]
[[ 4. 5.]
[ 6. 7.]]
[[ 8. 9.]
[ 10. 11.]]]
61/97
Algèbre
Slicing
On peut faire des opérations sur des sous-parties d’un ndarray en utilisant le
slicing. Il s’agit de préciser un ensemble d’indices avec la syntaxe first :last
où first est le premier indice et last est l’indice du dernier élement +1.
a = np.arange(5.0)
print(a)
Output :
[ 0. 1. 2. 3. 4.]
[ 0. 11. 12. 3. 4.]
[ 0. 11. 12. 40. 40.]
62/97
Algèbre
Slicing
Si on ne présise pas first ou last, python prend par défaut le début et la fin
du tableau dans cette dimension. On peut même utiliser la syntaxe
first :last :step pour accéder aux éléments d’indices séparés de step.
a = np.arange(5.0)
print(a)
# Set array to 10 up to the 3rd value
a[:3] = 10.0
print(a)
numbers = np.arange(30)
print(numbers)
[ 0. 1. 2. 3. 4.]
[ 10. 10. 10. 3. 4.]
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 29]
[ 0 4 8 12 16 20 24 28]
63/97
Algèbre
Slicing
a = np.arange(12.0).reshape(3, 4)
print(a, "\n")
# Extract 2nd line
print(a[1, :], "\n")
# Extract 3rd column
print(a[:, 2], "\n")
Output :
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]
[ 4. 5. 6. 7.]
[ 2. 6. 10.]
64/97
Algèbre
Matrices
A = np.arange(4.0).reshape(2, 2)
print("A\n", A, "\n")
x = np.array([1.0, -2.0])
print("x\n", x, "\n")
print("Ax\n", A.dot(x), "\n")
B = np.array([[1.0, 1.0], [0.0, 1.0]])
print("B\n", B, "\n")
print("AB\n", A.dot(B))
A
[[ 0. 1.]
[ 2. 3.]]
x
[ 1. -2.]
Ax
[-2. -4.]
B
[[ 1. 1.]
[ 0. 1.]]
AB
[[ 0. 1.]
[ 2. 5.]]
65/97
Algèbre
Matrices
A = np.arange(4.0).reshape(2, 2)
B = np.arange(-2.0, 2).reshape(2, 2)
x = np.array([1, 2])
# Python 3.5
# A B x
print A.dot(B.dot(x))
print(A @ B @ x)
Output :
[ 2. -2.]
[ 2. -2.]
66/97
Algèbre
Matrices
Lorsqu’on mélange les vecteurs et les matrices, il faut parfois faire attention
aux dimensions des objets manipulés. Si on extrait une ligne et une colonne
d’une matrice, on obtient dans les 2 cas un tableau 1D.
A = np.arange(4.0).reshape(2, 2)
print(A, '\n')
A_r1 = A[0,:]
print("row 1", A_r1, '\n')
A_c1 = A[:,0]
print("col 1", A_c1, '\n')
Output :
[[ 0. 1.]
[ 2. 3.]]
row 1 [ 0. 1.]
col 1 [ 0. 2.]
67/97
Algèbre
Matrices
Il semble donc qu’on ait pas l’information exacte de ce qui est extrait. Pour
garder l’information ligne ou colonne, on peut être tenté de tout passer en 2D.
A = np.arange(4.0).reshape(2, 2)
print(A, '\n')
[[ 0. 1.]
[ 2. 3.]]
row 1
[[ 0. 1.]]
col 1
[[ 0.]
[ 2.]]
68/97
Algèbre
Matrices
Mais il faut alors faire attention quand on fait des produits scalaires ! !
UT = np.arange(3.).reshape(1, 3)
V = np.full((3,1), -1)
print("U^T\n", UT, '\n')
print("V\n", V, '\n')
result = UT.dot(V) # Or UT @ V
U^T
[[ 0. 1. 2.]]
V
[[-1]
[-1]
[-1]]
U^T V
[[-3.]]
(1, 1)
3.0 69/97
Algèbre
Matrices
Il existe des fonctions spécialisées pour créer des matrices. Par exemple pour
la matrice identité, on peut utiliser identity (matrice carrée) ou eye (génère
une matrice avec des 1 sur la diagonale).
Output :
[[ 1. 0. 0. 0.]
[ 0. 1. 0. 0.]
[ 0. 0. 1. 0.]]
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
70/97
Algèbre
Matrices
A = np.arange(9.).reshape(3,3)
print(A, "\n")
print(np.diag(A), "\n")
print(A.T) # Ou np.transpose(A)
Output :
[[ 0. 1. 2.]
[ 3. 4. 5.]
[ 6. 7. 8.]]
[ 0. 4. 8.]
[[ 0. 3. 6.]
[ 1. 4. 7.]
[ 2. 5. 8.]]
71/97
Algèbre
Copies VS références
A = 18
B = A
B = 22
print(A)
print(B)
18
22
A = np.arange(3)
B = A
B[2] = 18
print(A)
print(B)
Output :
[ 0 1 18]
[ 0 1 18]
Ce comportement peut être expliqué par le fait qu’il est en coûteux de copier
des tableaux en mémoire, et on préfère manipuler des références vers ceux-ci.
A = np.arange(5)
print(A)
even = A[0:len(A):2]
print(even)
even[1] = 33
print(even)
print(A)
[0 1 2 3 4]
[0 2 4]
[ 0 33 4]
[ 0 1 33 3 4]
74/97
Algèbre
Copies VS références
A = np.arange(9).reshape(3,3)
print(A, '\n')
At = A.T
At[1,2] = 18
print(At, '\n')
print(A)
[[0 1 2]
[3 4 5]
[6 7 8]]
[[ 0 3 6]
[ 1 4 18]
[ 2 5 8]]
[[ 0 1 2]
[ 3 4 5]
[ 6 18 8]]
75/97
Algèbre
Copies VS références
A = np.arange(3)
B = np.array(A)
B[2] = 18
C = np.copy(B)
C[1] = -9
print(A)
print(B)
print(C)
[0 1 2]
[ 0 1 18]
[ 0 -9 18]
76/97
Algèbre
Scipy
import numpy as np
import scipy as sp
import scipy.linalg as spl
77/97
Algèbre
Scipy
Basics :
inv(A) : Compute the inverse of a matrix.
solve(A,b) : Solves the linear equation set Ax = b for the unknown x for
square A matrix.
solve triangular(A,b) : Solve the equation Ax = b for x, assuming A is
a triangular matrix.
det(A) : Compute the determinant of a matrix.
norm(A) : Matrix or vector norm.
lstsq(A,b) : Compute least-squares solution to equation Ax = b.
kron(a,b) : Kronecker (tensor) product between a and b.
78/97
Algèbre
Scipy
Eigenvalue Problems :
eig(A) : Solve an eigenvalue problem (find eigenvalues, and right or left
eigenvectors) of a square matrix.
eigvals(A) : Compute eigenvalues from an eigenvalue problem.
Decompositions :
lu(A) : Compute pivoted LU decomposition of a matrix.
lu solve(LU A,b) : Solve an equation system, Ax = b, given the LU
factorization of A
qr(A) : Compute QR decomposition of a matrix.
rq(A) : Compute RQ decomposition of a matrix.
Matrix Equation Solvers :
solve sylvester(A,B,Q) : Computes a solution X to the Sylvester
equation AX + XB = Q
79/97
Algèbre
Scipy
A
[[ 2. -1. 0.]
[-1. 2. -1.]
[ 0. -1. 2.]]
b [ 3. 0. 1.]
X such that Ax = b
[ 2.5 2. 1.5]
Ax =
[ 3.00000000e+00 2.22044605e-16 1.00000000e+00]
80/97
Plotting (matplotlib)
Utilisation basique
import numpy as np
import matplotlib.pyplot as plt
plt.savefig("file1.png")
plt.show()
81/97
Plotting (matplotlib)
Utilisation basique
On a ici fait l’utilisation la plus basique avec deux tableaux (ou listes) de
même taille X et Y , on a fait plot(X,Y).
82/97
Plotting (matplotlib)
Utilisation basique
plt.savefig("file2.png")
plt.show()
83/97
Plotting (matplotlib)
Utilisation basique
84/97
Plotting (matplotlib)
Personnalisation des courbes
85/97
Plotting (matplotlib)
Personnalisation des courbes
plt.savefig("file3.png")
plt.show()
86/97
Plotting (matplotlib)
Personnalisation des courbes
87/97
Plotting (matplotlib)
Personnalisation des axes
On peut utiliser xlabel et ylabel pour rajouter des informations sur les axes.
Pour afficher la légende, on utilise legend.
plt.xlabel("x axis")
plt.ylabel("y axis")
plt.legend()
plt.savefig("file4.png")
plt.show()
88/97
Plotting (matplotlib)
Personnalisation des axes
Pour choisir les valeurs minimales et maximales pour les axes, on utilise
axis([xmin, xmax, ymin, ymax]). 89/97
Plotting (matplotlib)
Personnalisation des axes
90/97
Plotting (matplotlib)
Subplots
plt.subplot permet de définir des graphes les uns à côté des autres.
Les arguments sont nrows, ncols, index.
Les sous-graphes seront placés selon leur index de gauche à droite et de
haut en bas, sur une grille nrows×ncols.
plt.figure(figsize=(1, 1)) crée une image “inch-by-inch”.
plt.suptitle(”title”) crée une titre global
91/97
Plotting (matplotlib)
Subplots
plt.figure(figsize=(9, 3))
plt.subplot(131)
plt.plot(x, np.sin(x), label="Sinus")
plt.axis(lims)
plt.legend()
plt.subplot(132)
plt.plot(x, np.cos(x), label="Cosinus")
plt.axis(lims)
plt.legend()
plt.subplot(133)
plt.plot(x, np.tan(x), label="Tangent")
plt.axis(lims)
plt.legend()
plt.suptitle("trigonometric functions")
plt.savefig("file6.png")
plt.show()
92/97
Plotting (matplotlib)
Subplots
93/97
Plotting (matplotlib)
Barplots
On utilise bar pour faire un graphe en barres, avec les clés en abscisses et les
valeurs en ordonnées.
plt.figure(figsize=(9, 4))
plt.bar(computers, rpeak)
plt.savefig("file7.png")
plt.show()
94/97
Plotting (matplotlib)
Barplots
95/97
Plotting (matplotlib)
Exercice
Obtenir ce graphe
à partir de :
boxoffice = {
"I": 1027,
"II": 649.4,
"III": 848.7,
"IV": 775.4,
"V": 538.3,
"VI": 475.1,
"VII": 2068,
"VIII": 1332,
"XI": 1074
} 96/97
Dernier exercice
Résoudre une équation d’advection linéaire
Soit u(x, t) : R × R+ → R, x ∈ R, t ∈ R+ , a ∈ R+
∂u ∂u
+a =0
∂t ∂x
Considérez le domaine x ∈ [−1, 1], une vitesse d’advection a = 0.3, jusqu’au
temps tf in = 2.5. Partir d’une condition initiale
2
u(x, 0) = u0 (x) = e−1/(1−(x/0.1) )