Comment débuter avec Python Une selection d`instructions

publicité
Comment débuter avec Python
"Mon choix" d'une version et d'un environnement. Cas d'un PC sous windows (nul n'est parfait)
Version de python "de base" : Installation : http://www.python.org/download/releases/
A ce jour pas de décision de prise au niveau CPGE national. Personnellement j'ai installé python 3.2.3 avec bibliothèques
numpy et matplotlib (cf plus loin). Il semblerait que la version 2.7 soit préférée à la 3.2 pour débuter cette réforme. En effet la
version 2.7 antérieure dispose de nombreuses bibliothèques.
Abréviation dans ce poly : Pour les deux versions j'utilise v2 ou v3 pour les distinguer.
Choix d'un IDE : IDLE fournit avec Python. Sinon ils sont nombreux, iep, pythonwin, spyder dans winpython.
Astuce : Avec IDLE. Créer un raccourci sur son bureau (ou vous voulez), puis bouton droit/propriétés et c'est là qu'on
paramètre le dossier par défaut de IDLE mais aussi du shell associé. (suis je clair ?)
Bibliothèques de fonctions numpy et matplotlib.
numpy " numeric python" . Installation : www.numpy.org
Obligatoire pour pouvoir faire des calculs même les plus simples.
Remarques : On peut tout de même utiliser math de "python de base" pour débuter sans numpy.
matplotlib " mat de matlab ? " Installation : www.matplotlib.org
Bibliothèque pour faire des graphiques 2D (et projections 3D), on peut tout faire en 2D avec matplolib mais demande de
l'investissement. Intérêt pour un utilisateur d'un autre logiciel graphique ?
Aide pour Python de base :
Aide depuis Python "rustique" mais parfois efficace :
>>>dir(bibliotheque ou objet)
# liste attributs et méthode ou fonctions. Il faut avoir importé la biblio avant.
>>>help(nom de fonction)
# renvoie dans le shell une notice de la fonction !
Aide aussi par menu dans IDLE.
Sur internet :
Internet cf différents liens après surtout pour numpy et matplotlib.
Fsincere
$$ celui de l ups
Sinon joyeux foutoir.
Les livres : Sur python "de base", ils sont assez nombreux. Sur numpy matplotlib aucun en français à ma connaissance.
Une pub sur un livre sous licence GPL téléchargeable gratuitement :
Un choix tout intégré. Toujours sous windows
Si vous ne souhaitez pas installer Python mais juste tester, il existe WinPython. C'est un package contenant python2.7, numpy
matplotlib, scypi , et l'IDE spyder. Ce package ne demande pas d'installation. Précisément il se décompresse dans un dossier
de votre choix (une clé USB peut convenir) et il n'y a pas d'installation proprement dite donc c'est transportable (suis je clair ?)
Critique personnelle : De mémoire décompressé ça pèse 800 méga, et au démarrage c'est lent. De plus pour débuter je préfère
l'IDE IDLE plus sobre.
Une selection d'instructions algorithmiques
Je propose ici une sélection suffisante pour le niveau de ce document et qui se traduit facilement dans les langages Python,
Scilab, Turbo Pascal, Maple etc....
Les commentaires
Ils sont neutres (non interprétés par le programme) faits pour nous les humains, ils permettent d'annoter l'algorithme pour
faciliter sa compréhension. J'utilise le symbole # suivi du commentaire. C'est le cas en Python en Maple.
Les entrées sorties
La majorité des algorithmes utilisent des données entrées par l'utilisateur de l'algorithme, et renvoient un résultat sous forme
d'affichage. Ces notions d'entrée/sortie ont des traductions très différentes suivant les langages. Par exemple Les commandes
3
input et print en Python. input n'existe pas en Maple. L'objet fonction plus évolué gère efficacement le problème des entrées
sorties.
Dans les algorithmes j'utilise si nécessaire les mots entrer ( .....) , et afficher( .... )
Affectation
L'affectation consiste à affecter une (des) valeur(s) à une variable.
En algorithmique elle se note : nom de la variable ← valeur
ou
valeur  nom de la variable
Remarque : Principe de fonctionnement de : nom de la variable ← valeur
Le membre de droite est évalué si nécessaire, et la variable dont le nom est indiqué à gauche reçoit le résultat de cette
évaluation.
exemple 1
exemple 2
b←2
b←2
a←b
b ← b + 1 # un tube en informatique
La variable a, reçoit la valeur 2.
La variable b reçoit 3
Booléens, fonctions booléennes
On appelle ensemble des booléens l'ensemble B = {Vrai, Faux} = { True, False }. On appelle fonction booléenne toute
anglais
fonction à valeur dans B. Vous connaissez plusieurs fonctions booléennes pratiquées de façon usuelle :
non , et, ou , ou exclusif (fromage ou dessert) ce sont des fonctions définies sur B ou B×B à valeur dans B.
Vous connaissez aussi les fonctions booléennes >, <, =, ≤, ≥, ≠. Par exemple (2 < 3) vaut Vrai, (3 ≠ 3) vaut Faux.
Blocs d'instructions
Instructions conditionnelles
condition représente une expression à valeur booléenne.
La plus classique, la plus élémentaire, la plus générale.
si condition
groupe d instructions1
sinon
groupe d'instructions2
si condition
groupe d instructions
si condition1
groupe d'instructions
si condition2
groupe d'instructions
si condition3
groupe d'instructions
sinon
groupe d'instructions
Remarques : J'ai indenté (ou décalé) mais groupes d'instruction vous allez vite comprendre pourquoi.
Signification pour la classique : si condition vaut Vraie le groupe d'instructions1 est effectué si condition vaut Faux c'est le
groupe d'instructions2 qui est effectué.
exemple Voici un algorithme bien connu.
entrer ( x )
# la valeur entrée est affectée à x
si x  0 alors
afficher (x) # Affiche le contenu de x pas la lettre x
sinon
afficher (– x) # idem affiche le contenu de – x
fin de si
Blocs d'instruction de type Boucles
Boucles conditionnelles
condition représente une expression à valeur booléenne.
4
tant que condition faire
groupe d'instructions
fin de faire
Signification : si condition vaut Vraie, on effectue le groupe d'instructions, on revient à condition, si elle est encore vraie, on
effectue le groupe d'instructions, et ceci tant que condition est vraie. Ca "boucle" tant que condition reste vraie.
Attention : Il est donc indispensable qu'à un moment le groupe d'instructions modifie la valeur de condition, sinon la boucle
tourne sans fin, un grand classique dans l'art du bug !
Boucles du type compteur
Indice est une liste de valeurs, une séquence de valeurs, en gros un ensemble ordonné. La aussi je m'adapte à Python.
pour compteur variant dans Indice faire
groupe d'instructions
fin de faire
Signification : la variable compteur va recevoir successivement toutes les valeurs de Indice, et à chaque fois le groupe
d'instructions est effectué
Exemple : Que renvoie cet algorithme ?
S←0
i ←0
tant que ( i ≤ 10 ) faire
S← S+i
i ←i+1
fin de faire
afficher ( S )
Exemple : Que renvoie cet algorithme ?
S←0
pour i variant de 1 à 10 faire
S←S+i
fin de faire
afficher (S)
Algorithmique et traduction Python
Remarques : Pas de difficulté majeure à traduire les instructions algorithmiques en Python.
Principe élémentaire de fonctionnement de Python.
Remarques : Au 01/01/2013 j'utilise la version 3.2.3 de python et l'interface IDLE pour Pythoner.
Dans la fenêtre "Python shell" le prompt >>> attend un calcul à effectuer, il le renvoie par retour chariot.
Bien entendu vous souhaiterez écrire des scripts (des programmes) dans un fichier. Pour cela vous pouvez utiliser tout éditeur
de fichier texte indépendant de Python pour écrire ces scripts de commandes. Il faut alors les enregistrer avec l'extension .py.
Vous pouvez par exemple utiliser notpad pour écrire des scripts de commandes python. Fun fun !
Pour les exécuter il suffit depuis IDLE de taper F5 .
Remarques : Par double clic sur un .py, il est exécuté par Python dans une fenêtre dos, fenêtre dos qui se ferme tout de suite je
crois bien donc souci.
Affectation
En Python, l'affectation est représentée par =
nom de la variable = valeur
exemples :
>>> x = 1 # La variable x reçoit la valeur 1.
Puis >>> y = x + 1 # la variable y reçoit 2.
>>> x = 1
>>> x = x + 1
>>> x # au final x reçoit 2
5
Python n'est pas un langage de calcul formel (pas exactement voir sympy par exemple). Il ne peut pas affecter à une variable
une expression d'une autre variable non affectée.
Affectations multiples
>>> a, b, c = 1, 2, 3
>>> a, b, c = c, b, a # Que valent a, b, c ?
Remarques : Voir plus loin le bel exemple de Fibonnacci.
Abréviations d'affectations classiques
>>> a = a + 1 peut se noter >>> a += 1
Remarque non débutant : Cette 2eme syntaxe est interprétée plus efficacement par python c'est l'incrémentation. Bien entendu
l'éviter pour débuter, fait économiser 1 caractère et ça me perd.
Restart : Célèbre commande Maple existe dans le menu de Python shell.
Type des données affectées aux variables. Opérations élémentaires.
C'est un point essentiel d'ou sa longueur. Bien comprendre les types des données que l'on manipule est indispensable à la
compréhension, l'utilisation, la fabrication de programmes en Python.
Exemple : Si un élève confond un vecteur v ∈ 3 et un scalaire λ ∈ , le professeur de mathématiques que je suis est fâché,
plutôt désespéré. Python lui Bugue sans crier, problème de type !
Remarques : Dans le shell la commande type(donnée) renvoie le type d'une donnée (on peut aussi dire sa classe). Forcer par
print(type(donnée) ) dans un script.
Remarques : En Python le typage est dynamique. Vous affectez ce que vous voulez à une variable il se débrouille. Autrement
dit pas besoin de préciser le type de la variable avant d'affecter. C'est très pratique.
Type Booleen
True False
# respecter la majuscule.
>>> type(True) # renvoie <class 'bool'>
Opérations sur les booléens
or, not, and, ^ (le xor le ou exclusif. Merci pour les maths la notation ^ vraiment merci )
== (l'égalité doit se distinguer du = de l'affectation), != ( le ≠ ) , <, >, <= ( le  ), >= ( le  )
Remarque :
>>> a = 2
>>> a == 2
# Signifie l'affectation de 2 à la variable a.
# représente la valeur booléenne vraie si a = 2, fausse si a ≠ 2
Exemples : Qu'affiche Python dans ces cas :
>>> True and not(False) == True ^ False
>>> a= True
>>> b = False >>> print( not(a) or b )
>>> a = True >>> b = True >>> print (a and not(b) ) or not(a) )
>>> 10 ^ 2
# renvoie 8 .
2
Réponse : 2^10 = 10
^ 1010
2
= 1000
2
= 8 qui a compris ?
Type entier
>>>type(5)
#renvoie <class 'int'>
Remarques : Il y a une évolution entre v2 et v3 la dernière accepte les entiers longs.
Opérations sur les entiers
+ , *, , ** (l'exposant, pas ^ rappel ) , / , // (c'est le quotient de la division euclidienne, la aussi évolution de v2 à v3), % (le reste
de la division euclidienne dit aussi modulo)
Type réel
>>> type(3.14) # renvoie < class 'float'>
6
Opérations sur les réels
+, *, ** (l'exposant) , / , mais aussi // et % qui fonctionnent sur les réels ( Olé Olé ! Osé Osé ?)
Exemple : Pour le moins surprenant et déstabilisant. Origine la liste info2013. Celui ci est la pour mettre en garde sur l'usage du
type 'float' .
>>> a=1/2 – 2/5
>>> a
# renvoie 0.09999999999999998
# bien entendu ça fait 1/10 soit 0.1
Remarques : Pourquoi une erreur sur un exemple si simple ? Réponse de la liste : Cela vient du fait que 1/5 a un
développement infini en base deux. Dépasse le débutant que je suis.
Type complexe (nombre complexe)
Remarques : Sans doute à partir de v3, pas testé v2. Je n'utilise pas ce type dans l'exposé.
Le nombre complexe noté  en math, j en physique se note en Python 1j (original !)
>>> type(1+1j*2)
# renvoie <class 'complex'>
Remarques : Il peut paraître étonnant que Python "de base" qui "ne connait pas" les fonctions réelles sin, exp connaisse les
complexes.
Opérations sur les complexes
+ , *, , ** (l'exposant il accepte l'exposant. Rien compris à ce jour) , / , abs (le module).
Par contre // et % il n'en veut pas ( can't mod complexe number. ouf ? )
Type chaine de caractères
C'est déjà un type de données composites. "Séquences" ou collections ordonnées d'éléments. Il se prête donc bien aux boucles
de type compteur. Une chaine de caractère se note : ' les caractères de votre choix '
type( ' toto ' )
# renvoie <class 'string' >
Opérations sur les chaines de caractère
Nombreuses, données de type composées. Si a et b sont deux chaines de caractère :
a+b
# concaténation de a e t b
2*a
# doublage de a...... c'est à dire a + a
a[i]
# renvoie le caractère d'indice i dans la chaine. Attention ça commence à zéro dans Python, il va falloir s'y faire.
Exemples : >>> a = 'toto'
>>> b = 'tata'
Que renvoie >>> a+2*b
>>> a + 2
>>> a + '2'
Réponse pour : >>> a+2 # bug on ne peut pas concaténer a et 2 qui est du type int. Vous suivez !
Type listes
Une liste est une collection d'objets écrite sou la forme [ objet1, objet2, ......, objetn ] . Je ne résiste pas à dire une séquence
entre crochets, 17 ans de Maple derrière. La notion de séquence n'est pas très claire en Python.
>>> type([4,5,'toto',3.5,True])
#renvoie <class 'list' >
Remarques : Vous avez remarquez que j'ai mis dans ma liste des objets de type différent et que Python ne râle pas. Une liste
peut même contenir des listes.
>>>> a=[[1,2],[3,4]]
# on peut toujours rêver qu'il la comprenne comme matrice 2x2 c'est un rêve hélas.
Opérations sur les listes
Innombrables ! On peut tout faire même se que l'on n'imagine pas ! Citons des opérations élémentaires.
Si L1 et L2 sont deux listes
L1 + L2
# concaténation de L1 et L2
2*L1
# Il comprend L1 + L1. En aucun cas multiplication par 2 sur les éléments de L1. Mais comment va t on faire
pour la multiplication scalaire sur les vecteurs ? Et les lois d'algèbre alors ! Réponse numpy bien entendu.
7
L1[i]
L1[i]='toto'
[]
# extraction du terme d'indicie i de L1 . La aussi commence à zéro.
# modification de l'élément d'indice i prenant la valeur 'toto'
# est la liste vide. Peut servir dans de l'initialisation.
Exemple décevant ?
>>>ma=[[1,2],[3,4]]
>>> 2*ma
# renvoie [[1, 2], [3, 4], [1, 2], [3, 4]]. C'est bien 2 fois la liste ma il a raison.
Remarques : On peut appliquer toute sorte de méthodes à une liste Python étant orienté objet cf plus loin.
Conversion de types. Autres types
En vrac :
1 – Le type 'tuple' . Explication Wikipedia Les objets tuple (ou n-uplet) sont des listes non mutables d'objets hétérogènes.
>>> a = 1,2,3
>>> type(a)
# renvoie <class 'tuple'>
Cela me gène un peu pas de [ ] dans ce cas. C'est pour moi une séquence étant fortement conditionné par Maple.
2 – Il y a d'autres types en Python. Voir la page bien faite de Wikipedia par exemple.
3 – La conversion de certains types est possible. Typiquement si j'ai '1' , int('1') convertit en 1.
Plus évolué : ord('x') convertir le caractère x en la valeur de l'octet écrit en base 10 (vous avez compris ?)
chr(12) fera le contraire écrire le caractère (si c'est possible à afficher !) dont l'octet vaut 12 en base 10.
4 – En tant que matheux ou physiciens on aimerait que les listes se comportent comme des matrices ou vecteurs. Pour cela
nous allons plus loin utiliser numpy et son type array.
Blocs d'instruction
En python les limites des blocs d'instructions sont définies par l'indentation, la mise en page.
Instructions conditionnelles
La plus classique, la plus élémentaire, la plus générale.
if condition :
groupe d instructions
else :
groupe d'instruction
if condition:
groupe d instructions
if condition :
groupe d'instructions
elif :
groupe d'instructions
elif :
groupe d'instructions
else :
groupe d'instructions
Blocs d'instruction de type boucles
Boucles conditionnelles
Boucles de type compteur
while condition:
groupe d'instructions
for i in Indice
groupe d'instructions
La mystérieuse et très utilisée fonction range : range(n) créait "la séquence" d'indices 0,1,....., n – 1. Elle permet donc de
traduire l'instruction très employée : pour i variant de 0 à n – 1.
Pourquoi mystérieuse ? Je n'ai toujours pas compris le type de range(n). En Python v2.7 c'est une liste, en v3.2 cela devient
mystérieux pour le débutant que je suis !
Exemple : A l'aide d'une boucle compteur et la multi affectation créaient la suite de Fibonacci.
Les fonctions
J'ai déjà utilisé range( ), abs( ). Elles sont essentielles. Bien entendu on peut créer des scripts sans utiliser les fonctions.
8
Syntaxes
# Plutôt procédure ou sous programmme
def nom_fonction (sequence de paramètres) :
global a,b,c # par défaut locales
groupe d'instructions
# Plutôt fonction
def nom_fonction (sequence de paramètres) :
global a,b,c # par défaut locales
groupe d'instructions
return valeur
Remarques : . Maple a un sens des fonctions proche des maths. En python on préférera éventuellement parler de procédure ou
sous programme.
Remarques : Erreur dans le bouquin de G Swinnenn qui parle pour les paramètres d'entrée de liste. Je m'aperçois à nouveau
que cette notion de séquence est peut modélisée en Python.
Paramètres d'entrée, variables locales, variables globales
Paramètres d'entrées : On peut modifier la valeur d'un paramètre d'entrée dans le bloc d'instructions d'une fonction. Pour
comparaison pas possible en Maple, possible en Turbo Pascal.
Variables locales, globales : Pas clair pour moi à ce jour, je m'explique (cf exemple plus loin) :
Soit a une variable affectée dans votre session (srcipt).
Si a n'est pas déclarée dans votre fonction mais affectée à une valeur, alors elle est considérée comme locale (par défaut). Vous
avez alors deux variables a portant le même nom mais différentes. C'est l'intérêt des variables locales pour éviter les conflits.
Si a est déclarée globale dans votre fonction. Elle est vue par la fonction comme la variable a extérieure et modifie donc cette
variable.
Enfin le cas qui me gêne, si a n'est pas déclarée dans votre fonction elle peut être utilisée par celle ci sans être modifiable. La la
procédure la reconnait comme celle de la session.
Voici un exemple: # De vrais fonctions et problème de gestion des variables.
a=10
def essai1(n):
def essai2(n):
a=2
global a
n=a+n
a=2
return n
n=a+n
return n
# Après exécution a vaut 10
# Après exécution a vaut 2
def essai3(n):
n=a+n
return n
# Est ce une bonne idée qu'il autorise ?
Remarques : Python ne semble pas accepter local a. local notion par défaut exclusivement ?
Recursivité
Une définition de la récursivité (risquée pour un non informaticien) : Une fonction peut s'appeler elle même dans sa
construction.
Exemple : Fibonacci récursif, en comparaison avec la multi affectation + boucle vue avant.
def fibo(n):
if n==0 or n==1:
return 1
else:
return fibo(n – 1)+fibo(n – 2)
Python Programmation Orientée Objet "POO"
Partie en travaux
Python est un langage de programmation orienté objet. Il n'est pas nécessaire ici de maitriser cette notion, la comprendre un
peu semble important pour mieux comprendre la syntaxe.
A ce jour je ne sais rien de la programmation orientée objet. Voici juste un peu de vocabulaire :
Nous manipulons en python des objets.
9
La classe d'un objet : Un objet appartient à une classe on dit que c'est une instance de sa classe.
>>> type(objet) # renvoie sa classe, on comprend mieux les <class, 'type' > vu précédemment pour les types.
Les Attributs et méthodes pour un objet :
>>> dir(objet) # renvoie la liste de ses méthodes et attributs.
Les méthodes pour un objet sont les fonctions applicables à cet objet.
Les attributs pour un objet sont les variables liées à cet objet.
Un exemple, simple et puissant à la fois, de manipulation d'objet :
>>> x=[5,7,12,4,1]
# création d'un objet liste. C'est donc une instance de la classe list.
# j'aurai pu débuter par x=list() qui créait un objet vide de la classe list puis compléter son
# contenu. Ceci serait lourd et maladroit ici.
>>> dir(x)
# listing des méthodes et attributs disponibles pour cet objet.
>>> x.sort()
# Application de la méthode sort() qui ordonne x. Attention l'objet x a était modifié par
cette méthode.
>>> x.__doc__
# attribut __doc__ variable d'information sur x.
>>> x.append(123)
# méthode append(123) ajoute la valeur 123 en fin de la liste x. Idem, l'objet x modifé.
Remarques : Je n'aurai pas le temps de progresser sur ce point mais en écrivant ce résumé il me semble indispensable d'ajouter
cette compétence sans doute à un niveau 2.
Bibliothèque Numpy
Définition Wikipedia : NumPy est une extension du langage de programmation Python, destinée à manipuler des matrices ou
tableaux multidimensionnels ainsi que des fonctions mathématiques opérant sur ces tableaux.
Remarques : Vous trouverez souvent dans les documentations la notion de "ndarray" c'est à dire tableaux de dimension n.
Installation : www.numpy.org # dépend de votre choix d'environnement
Documentation pour débuter :
http://scipy-lectures.github.com/index.html ou si vous préférez le format pdf
http://scipy-lectures.github.com/_downloads/PythonScientific-simple.pdf
Importation dans une session : >>> import numpy as np
# créait un alias.
# on doit pouvoir faire >>> from numpy import * # mais est ce une bonne chose ?
# Vous pouvez faire à titre d'introduction >>>dir(np) # puis par exemple >>>dir(np.matrix)
Exemples de manipulation du type array de numpy. Bienvenue aux "nd_array"
import numpy as np
import matplotlib.pyplot as plt # juste pour la dernier exemple.
Tableau de dimension 1. "1d_array" .
Tableau de dimension 2. "2d_array"
a=np.array([1,2,3,4,5,6,12]) # vecteur ligne
print(a)
print(a.ndim) # dimension de a
print(len(a)) # nombre d'éléments de a
print(a.shape) # ?
print(a[0]) # premier élément de a
print(a[-1]) # dernier élément de a (cyclique)
print(a[:4]) # les éléments à partir du rang 4
print(a[1:6:2]) # les éléments du rang 1 à 6 par pas de 2
b=np.array([[1,2,3],[4,5,6]]) # matrice 2×3
print(b)
print(b.ndim) # dimension de b
print(len(b)) # nombre d'éléments de b
print(b.shape) # ?
print(b[0,1]) # Elément 1ere ligne 2eme colonne.
print(b[-1,2]) # Element dernière ligne 3eme colonne.
print(b[:,2]) # 3eme colonne
print(b[1,:]) # 2eme ligne
# si on veut un vecteur colonne on peut transposer a avec a.T ou transpose(a).
# on peut aussi construire un vecteur colonne va=np.array([[1],[2],[3],..,[12]])
Tableau dans la 2x3x3eme dimension ou un "2x3x3d_array" ouah !
C'est en fait le cas classique de manipulation d image par RGB. J'anticipe ici matplotlib.pyplot
c=np.array([[[.1,.2,.3],[.1,.2,.3],[.1,.22,.33]],[[.1,.12,.13],[.4,.5,.6],[1.,1.,1.]]])
plt.imshow(c)
10
plt.show() # c'est beau non ?
Calculs sur les array
ma=np.array([[1,2,3],[4,5,6]])
v=np.array([1,2,3])
vv=np.array([[1],[2],[3]])
print(ma+2)
print(2*ma)
print(ma+ma)
print(ma.T)
print(ma*ma)
print(ma.dot(vv))
# matrice 2x3
#vecteur ligne
# vecteur colonne
# ajout de 2 à tous les termes
# multiplication scalaire enfin comme en math !
# addition matricielle ouf !
# Transpose ma, aussi np.transpose(ma)
# multiplication termes à termes peu habitués en math.
# multiplication matricielle
np.meshgrid
Cette commande de numpy joue un rôle important pour la fabrication de certaines images ou pour faire une représentation 2d d'une surface.
Si x et y sont deux 1d –array meshgrid(x,y) va créer une "grille de valeurs" relatives à ces deux vecteurs. C'est à dire l'ensemble de tous les
couples possibles d'une valeur de x avec une valeur de y. Voici un copié collé de l'aide en ligne relativement bien faite grâce à
help(np.meshgrid) (après avoir fait l'alias bien entendu).
>>> X, Y = np.meshgrid([1,2,3], [4,5,6,7])
>>> X
>>> Y
array([[1, 2, 3],
array([[4, 4, 4],
[1, 2, 3],
[5, 5, 5],
[1, 2, 3],
[6, 6, 6],
[1, 2, 3]])
[7, 7, 7]])
`meshgrid` is very useful to evaluate functions on a grid.
Remarques : Ainsi si vous prenez une valeur de X avec une valeur de Y de même indices vous avez tous ces couples.
Bibliothèque Maplotlib.pyplot
Créateur John Hunter (1968-2012)
Définition wikipedia : matplotlib is a plotting library for the Python programming language and its NumPy numerical
mathematics extension. [...] There is also a procedural "pylab" interface based on a state machine (like OpenGL), designed to
closely resemble that of MATLAB. Matplotlib was written and maintained primarily by John Hunter, and is distributed under a
BSD-style license. Currently, matplotlib 1.2 has support for Python versions 2.7 through 3.2. Matplotlib 1.2 is the first version
of matplotlib to support Python 3.x. The package pylab combines pyplot with NumPy into a single namespace.
Installation : matplotlib.org. Prendre la version cohérente avec votre version de Python. La aussi l'installation dépend du choix
d'environnement.
Documentations pour débuter :
http://matplotlib.free.fr/ # En français
Le même document que pour numpy http://scipy-lectures.github.com/index.html
ou si vous préférez le format pdf http://scipy-lectures.github.com/_downloads/PythonScientific-simple.pdf
Importation dans une session : Nous utilisons essentiellement la bibliothèque matplotlib.pyplot.
>>> import matplotlib.pyplot as plt
# création d'un alias pour faciliter l'utilisation
# A titre d'introduction vous pouvez faire
>>> dir(plt)
# donne déjà un aperçu de la bibliothèque pyplot.
Documentations pour confirmer : Sans hésiter consulter le site matplotlib.org et télécharger la documentation de référence en
pdf sur ce même site. Plus de 1000 pages. Il est à mon avis necessaire d'avoir investit dans la notion de "POO" avant.
figure (optionnel)
Permet de paramétrer la (les) fenêtre(s) graphique(s). Par défaut il s'en sort très bien. Inutile pour cet exposé.
Exemple : plt.figure(figsize=(8,6),dpi=80) # c'est en inch en pouces.
subplot (optionnel)
Permet de mettre dans une même fenêtre différents graphiques, précisément de partitionner la fenêtre graphique.
Exemple: plt.subplot(2,2,3) # Partition 2 lignes 2 colonnes 3eme zone de la partition.
11
Remarques : pyplot comprend aussi (223) à la place de (2,2,3)
Remarques : la commande axes fait un peu la même chose mais en plus général, les différents graphiques pouvant se
superposer. Exemple : Inclure dans un graphique un autre graphique.
plot (notre objectif)
Voici quelques commandes de plot. Un objectif possible étant de traiter l'exemple 6 cf plus loin.
la commande plot dans sa version basique :
>>> plt.plot( x, y ) # x, y sont des 1d-array ou des listes. Trace le nuage de points M[i](x[i],y[i]) avec i = len(x) = ln(y).
Nous utiliserons souvent y = f(x) ou f opère sur les réels. Python fait automatiquement l'opération sur chaque opérande de x.
Apelle t on cela le mapping ?
Remarques : Si vous autre objectif est de tracer un nuage de points M[i,j] (x[i], y[j]) vous utiliserez np.meshgrid et plt.scatter,
cf plus loin.
>>> plt.plot( x ) # x est un 1d-array ou une liste. Il considère x comme une suite de valeurs, il trace alors le nuage de points
M[i] (i, x[i]).
Un peu de mise en forme du graphique . Pyplot comprend Latex . Toutes ses commandes sont optionnelles.
plt.xlabel(' votre texte ')
plt.ylabel(' votre texte ')
plt.title(' votre texte ')
plt.axis([xmin,xmax,ymin,ymax])
plt.xticks( liste1,liste2) # liste1 liste des valeurs des graduations ou 1d_array, liste2 optionnel les valeurs sur graduation. Par
défaut les mêmes que liste1.
plt.yticks(liste1,liste2)
plt.grid(True ou False la valeur par défaut # affiche ou pas la grille relative aux graduations
plt.text( 'votre texte')
Pour les physiciens et chimistes modification des échelles :
plt.loglog()
# Echelle logarithmique pour les deux axes
$$ je n'arrive plus à trouver le semi logarithmique pas plt.xlog $$
Quelques options, non nécessaires car valeurs par défauts, que l'on peut définir dans le plot.
linestyle = '–' # définit le style du tracé liant les points du nuage . linestyle=' ' permet de ne pas relier le nuage de points.
linewidth= # épaisseur de line "en points" c'est à dire relatif à votre figure sa taille et son dpi.
marker= 'o' # le symbole représentant les points du nuage de points.
markersize= # la taille du symbole toujours "en points".
color='red' # la couleur du tracé. pyplot sait manipuler toutes les couleurs (RGB etc ...).
Remarques : je ne peux ici proposer toutes les valeurs possibles de options elles sont trop nombreuses, plusieurs dizaines de
style pour linestyle, marker.
Et enfin ne pas oublier :
>>> plt.show() # Il y a ici un bug avec IDLE. La fenêtre graphique est sensée être dynamique en python, c'est à dire que l'on
peut ajouter des commandes dans le shell celle ci est mise à jour. Plante sous IDLE, j'y suis arrivé avec spyder.
Autre type de graphiques
Je suppose les alias np et plt créés.
plt.scatter . scatter "aime bien" meshgrid . Un exemple élémentaire :
>>> X, Y = np.meshgrid([1,2,3], [4,5,6,7]) >>> plt.scatter(X,Y)
>>>plt.show()
Remarques : plt.plot(X,Y) sort un graphique bien décevant (la droite x = 2) ce qui m'étonne, j'attendais une erreur.
plt.hist . utilisé dans l'exemple qu'elle heure est il.
Graphiques 3d avec matplotlib : La boite à outils mpl_toolkits.mplot3d
Remarques : Pour débuter j'importe ici "seulement" la bibliothèque Axes3D de mpl_toolkits.mplot3d.
12
Exemple: Voici un exemple, le plus simple possible, pour tracer une surface définie par z = f (x,y). J'ai pris un exemple sur
matplotlib.org puis nettoyé au maximum ses options. Voici le script (donc sans >>>)
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
# creation d un objet figure
ax = fig.gca(projection='3d')
# sans doute l'étape clé : Option projection='3d' de gca( ).
# On trouve aussi pour débuter la commande add_subplot(111, projection='3d' )
X = np.arange(-5, 5, 0.25)
# Création d une grille en x,y grâce à np.arange, puis meshgrid
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
# Evaluation de (x,y)  x2 + y2 sur la grille.
Z = np.sin(R)
#Evaluation de sin(R). On aurait pu faire d'un coup.
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, linewidth=1.0, antialiased=True)
# Commande plot_surface( ) du nuage de points (X,Y,Z). J'ai choisi de tracer les "lignes" qui aident à visualiser la surface.
ax.set_zlim3d(-1, 1)
# contrôle de la fenêtre z ∈ [-1,1]
plt.show()
# bien entendu sinon vous allez être déçus.
13
Téléchargement