Introduction à Python
Transcription
Chapitre 2 Introduction à Python Patient : What do I do ? Obstetrician : Nothing, dear, you're not qualied. Monty Python's The Meaning of Life 2.1 Installation de Python et des bibliothèques. Vous avez la possibilité d'installer manuellement vantes : NumPy SciPy SymPy MatPlotLib Python 1 , , et Python v.3.3.0 ainsi que les bibliothèques sui- . Ces bibliothèques constituent la conguration mini- male pour les applications que nous étudierons. Pour chacune d'elles, il faudrait : télécharger la version qui est compatible avec votre version de , la décompresser et l'installer (en cliquant sur le chier setup.py). Il est néanmoins plus simple d'installer automatiquement une distribution contenant non seulement l'interpréteur Python , mais aussi un choix de bibliothèques parmi les plus courantes ainsi qu'une in- terface pour aider à développer des programmes. Nous choisirons la distribution WinPython dont les bibliothèques sont orientées pour un usage scientique et qui a la particularité d'être portable. Cette caractéristique présente deux avantages : d'une part, cette distribution peut se déployer rapidement sur l'ensemble des ordinateurs d'une salle d'informatique et, d'autre part, les élèves ont la possibilité de l'emporter sur la clé USB où ils enregistrent leurs programmes. Téléchargez WinPython-3.3.0 à l'adresse : http://code.google.com/p/winpython/downloads/list. Exécutez le chier, choisissez un répertoire d'installation et. . . c'est tout. Vous pouvez commencer à travailler en lançant la console Spyder . Si vous souhaitez installer Python WinPython Control Panel sur une clé USB, vous pouvez désinstaller les bibliothèques qui ne vous intéressent pas à l'aide de . 2.2 Lexique Guide rapide de Python pour les habitués de C,. . . 1. Le passage de la version 2.x à la version 3.0 constitue une évolution majeure de profondeur si bien que le principe de compatibilité descendante a été rompu. 11 Python , le code a été revu en 12 CHAPITRE 2. INTRODUCTION À PYTHON 2.2.1 Instructions de base Caractères spéciaux commentaire : # ceci est un commentaire a\ Enter -b écriture sur plusieurs lignes : Tab : il importe de bien respecter les indentations car elles permettent de dénir des blocs. Contraire- ment au langage C, il n'y a pas d'accolades en Python . Mots-clés réservés and as assert break class continue def del elif else except false finally for from global if import in is lambda none nonlocal not or pass raise return true try while with yield Opérations mathématiques + - * / : opérations usuelles 2**3 : élévation à la puissance 10//3 : partie entière d'une division 10%3 : reste d'une division 1e-3 : réel 0, 001 1+3j ou complex(1,3) : complexe 1 + 3.i (avec i2 = −1) Opérateur de comparaison < > <= (inférieur ou égal) >= (supérieur ou égal) == (comparaison et non aectation) =! (diérent) Variables nom : sensible à la casse (majuscule/minuscule) aectation : suppression : a=7 del a a=b=2 permutation : a,b = b,a (pas besoin d'une troisième variable) raccourcis : a+=1 (pour a=a+1), a-=1 , a*=2 , a/=2 types : bool (booléen), int (entier), float (réel), complex (complexe), list set (ensemble), tuple (liste ordonnée non modiable), dict (dictionnaire), str aectation multiple : (liste ordonnée), (chaine de carac- tères entre "guillemets", 'apostrophe' ou """triple guillemets""") dans une chaine entre "guillemets" inclure les guillemets de cette façon : "J'ai dit \"Stop!\"" dans une chaine entre 'apostrophes' inclure les apostrophes de cette façon : 'J\'ai de la chance' Les variables locales - dénies avant d'appeler une fonction - sont lisibles lors de l'exécution de la fonction [règle 1]. Elles ne peuvent être modiées qu'en agissant sur l'objet par un mot-clé ou par une méthode [règle 2]. Les variables locales - dénies dans une fonction - sont supprimées après l'exécution de la fonction [règle 3]. On peut transformer des variables locales en variables globales (à l'aide de lors de l'exécution d'une fonction [règle 4]. global ) pour les modier 2.2. 13 LEXIQUE Exemple : l i s t e =[1 ,2 ,3] i =1 def fonction ( ) : #nécessaire pour pouvoir modifier i [ règle 4] #modification p o s s i b l e [ règle 2] p r i n t ( " d a n s l a f o n c t i o n " , i ) #variable i a c c e s s i b l e #même si on ne l 'a pas déclarée comme globale [ règle 1] i +=1 #impossible si on n 'a pas déclaré i comme gl o b al [ règle 2] u=2 #variable l o c al e qui sera supprimée [ règle 3] fonction () p r i n t ( l i s t e ) #la l i s t e a bien été modifiée par la fonction p r i n t ( i ) #la variable i a pu être modifiée #car e l l e a été déclarée comme globale p r i n t ( u ) #provoque une erreur car u a été supprimée global del i liste [0] Entrée-Sortie â g e ? " ) #age est une chaine de caractères #transforme la chaine de caractères en un entier . a g e=i n p u t ( " V o t r e a g e=i n t ( a g e ) p r i n t ( " a g e+1=" , a g e +1) Test if a >0: print (" p o s i t i f ") elif a <0: print (" négatif ") else : p r i n t ( " nul " ) Boucles boucle for c h a i n e=" B o n j o u r " for lettre in chaine : print ( l e t t r e ) boucle while i =0 while i <10: print ( i ) i +=1 break while True : l e t t r e =i n p u t ( " Taper Q p o u r if l e t t r e==Q : break quitter ") 14 CHAPITRE 2. INTRODUCTION À PYTHON continue i =1 while i <10: if i %3==0: i +=2 continue i +=1 #retour direct au while sans executer la suite Fonction #par défaut b=2 ( paramètre nommé) , #sauf si on impose une autre valeur r e t u r n ( a+b ) r e s u l t a t =a d d i t i o n ( 1 ) #donne 3 r e s u l t a t =a d d i t i o n ( 1 , 3 ) #donne 4 def a d d i t i o n ( a , b=2): def division (a , b ): q u o t i e n t=a // b r e s t e =a%b return #renvoie deux valeurs quotient , r e s t e c , d= d i v i s i o n ( 1 0 , 3 ) Pour les fonctions limitées à une seule instruction, on peut utiliser des fonctions lambda : f=lambda f (1 ,3) a , b : a+b # donne 4 Pour les fonctions avec un nombre de paramètres inconnus : def fonction(*parametres): que l'on appelle par fonction(a,b,c) la variable parametres représente un tuple (voir plus loin) Pour les fonctions avec un nombre de paramètres nommés inconnus : def fonction(**parametres_nommes): que l'on appelle par fonction(a=1,b=2,c=3) la variable parametres_nommes représente un dictionnaire (voir plus loin) Pour les fonctions avec un nombre de paramètres, nommés ou non, inconnus : def fonction(*parametres,**parametres_nommes): Chaine de caractères MaChaine=str() ou bien MaChaine="" aectation : MaChaine=" aBcD " création : minuscule : MaChaine.lower() #il s'agit méthode appliquée à MaChaine #mais MaChaine n'est pas modifiée majuscule : MaChaine.upper() première lettre en majuscule : MaChaine.capitalize() retirer les espaces au début et à la n : MaChaine.strip() MaChaine.center(10) caractères : MaChaine.rjust(10) centrer dans un espace de 10 caractères : justier à droite dans un espace de 10 2.2. 15 LEXIQUE découper une chaine en liste : MaChaine="1 2 3" MaChaine.split(" ") #la chaine est découpée en ['1','2','3'] reconstituer une chaine à partir d'une liste : MaListe=['1','2','3'];" ".join(MaListe) #la chaine précédente est reconstituée formater une chaine : prenom="jean";nom="martin";"je m'appelle {0} {1}".format(prenom,nom) "je m'appelle {prenom} {nom}".format(prenom="jean",nom="martin") ou bien accession à un caractère : MaChaine[0] #1er élément indexé 0 on ne peut pas modier un élément par son index comme pour une liste concaténation : MaChaine+"efg"+str(var) #si var n'est pas une chaine de caractères MaChaine[0:2] #sélectionne les 2 caractères indexés 0 et 1 MaChaine[:4] #sélectionne les 4 premiers caractères (à partir de l'index 0) sélection d'une sous-chaine : longueur d'une chaine : len(MaChaine) a=eval("1+1") #a=2 évaluation d'une chaine : Liste ordonnée création : MaListe=list() ou bien MaListe=[] MaListe=[1, 2, "trois"] #on peut lister des éléments de différents types aectation : MaCopie=list(MaListe) si vous faites : MaCopie=MaListe les s'appliqueront aussi à MaListe. accession à un élément : MaListe[0] #1er élément indexé 0 modication d'un élément : MaListe[2]=3 création d'une copie : ATTENTION ajout à la n : : appliquées à MaCopie MaListe.append(4) #MaListe est directement modfiée #il ne faut pas coder: MaListe=MaListe.append(4) insertion d'un élément : concaténation : modications MaListe.insert(2,2.5) #insère 2.5 à la 2ème place (entre 2 et 3) MaListe.extend([5,6,7]) ou bien MaListe+=[5,6,7] suppression d'un élément : del MaListe[0] #supprime le 1er élément (on indique la valeur de l'index) ou bien MaListe.remove(2) #sup. le 1er élément qui vaut 2 (on indique la valeur de l'élément) longueur d'une liste : len(MaListe) parcours des éléments d'une liste en précisant l'index : for element in enumerate(MaListe): print(element) passage d'une liste à un ensemble (sans élément redondant) : numpy.unique(MaListe) opérations multiples sur une liste : MaListe=[1,4,7] [element * element for element in MaListe] #crée la liste [1,16,49] MaListe=[1,4,7] [element * element for element in MaListe if element%2==0] #crée la liste [16] on peut également utiliser les fonctions map() et filter() . 16 CHAPITRE 2. INTRODUCTION À PYTHON carre=lambda x: x**2 list(map(carre,range(1,10))) #1 4 9 25 36 49 64 81 pair=lambda x: x%2==0 list(filter(pair,range(1,10))) #2 4 6 8 utilisation de listes pour créer des piles (dernier entrant, premier sortant) : MaPile=[1,2,3] MaPile.append(4) # [1, 2, 3, 4] MaPile.pop() #4 Ensemble Liste sans élément redondant. MonEnsemble=set() MonEnsemble=set([1,2,3]) #{1,2,3} test d'un élément : 4 in MonEnsemble #False union : e1=set([1,2,3]);e2=set([3,4,5]);e1|e2 #{1,2,3,4,5} intersection : e1=set([1,2,3]);e2=set([3,4,5]);e1&e2 #{3} diérence : e1=set([1,2,3]);e2=set([3,4,5]);e1-e2 #{1,2} seulement dans e1 diérence symétrique : e1=set([1,2,3]);e2=set([3,4,5]);e1^e2 #{1,2,4,5} union-intersection création : aectation : Tuple Liste non modiable après sa création. Création et aectation comme les listes mais avec des (parenthèses) au lieu des [crochets]. MonTuple=(1,2,3) MonTuple=(1,) #pour un élément unique, il faut mettre la virgule sinon Python #enlèverait automatiquement les parenthèses et transformerait le tuple #en une simple variable. Dictionnaire Liste non ordonnée où chaque élément est associé à une clé. Création et aectation comme les listes mais avec des {accolades} au lieu MonDico=dict() création : des [crochets]. ou MonDico={} ou bien MonDico={cle1:element1, cle2:element2} insertion ou modication d'un élément : MonDico["cle"]="element" #on peut utiliser n'importe quelle clé #pour indexer n'importe quel élément cas où l'élément est une fonction : accession à un élément : def fonction(): print("Hello") MonDico["f"]=fonction #sans les parenthèses MonDico["cle"] #si la clé ne correspond à aucun élément #on aura une exception de type KeyError 2.2. 17 LEXIQUE cas où l'élément est une fonction : suppression d'un élément : ou bien MonDico["f"]() #avec les parenthèses del MonDico["cle"] #supprime la clé et l'élément associé MonDico.pop("cle") parcours des clés : for cle in MonDico.keys(): for element in MonDico.values(): for cle, element in MonDico.items(): parcours des éléments : parcours des clés et des éléments : Gestion des erreurs try : c=a / b assert #on t e s t e une operation à risque c >0 #pour la suite du programme , on veut c>0 except NameError : except TypeError : except ZeroDivisionError : except AssertionError : p r i n t ( "a p r i n t ( "a p r i n t ( "b ou b n ' est pas défini ") ou b n ' est pas un est print (" le nombre " ) nul " ) résultat n ' est division n 'a pas positif ") else : print (" la et donne bien un pas résultat provoqué d ' erreur \ positif ") finally : p r i n t ( " qu ' i l y ait une erreur ou pas , on fait la suite ") ou bien try : c=a / b if #on t e s t e une operation à risque #pour la suite du programme , on veut c>0 r a i s e ValueError ( " l e r é s u l t a t n ' e s t pas p o s i t i f " ) #on génère un type d ' erreur ( i . e . on lève une exception ) c <=0: except NameError : except TypeError : except ZeroDivisionError : except ValueError : p r i n t ( "a p r i n t ( "a p r i n t ( "b print (" i l ou b n ' est pas défini ") ou b n ' est pas un est y nombre " ) nul " ) a un problème " ) else : print (" la et donne division bien un n 'a pas résultat provoqué d ' erreur \ positif ") finally : p r i n t ( " qu ' i l y ait une erreur ou pas , on fait la suite ") Importation des bibliothèques import math #importation de toutes les fonctions de la bibliothèque math math.sqrt(9) #utilisation de la fonction sqrt de la bibliothèque math import math as mathematique #importation en changeant le nom de la bibliothèque from math import sqrt #importation de la seule fonction sqrt 18 CHAPITRE 2. INTRODUCTION À PYTHON sqrt(9) #utilisation de la fonction sqrt importée (sans avoir besoin de préciser math.) from math import * #importation de toutes les fonctions de la bibliothèque math #on peut alors appeler toutes les fonctions sans avoir besoin de préciser math. #mais attention aux doublons si on utilise plusieurs bibliothèques import paquet.souspaquet #importation du souspaquet se trouvant #dans un sous-répertoire de paquet Biblothèques utiles : os, math, random, . . . 2.2.2 Sauvegarde du code Spyder # −∗− coding : Latin −1−∗− Dans l'éditeur de import , créez un chier où vous insérez au début : os Tapez votre code et insérez à la n : os . system ( " pause " ) Sauvez le chier avec l'extension Si vous n'utilisez pas .py et lancez l'exécution (Menu Spyder , prenez un éditeur type : Exécution/Exécution). NotePad++ et faites de même. Exécutez directement le code en double-cliquant sur le nom du chier ou bien utilisez l'éditeur IDLE de Python (clic droit sur le nom du chier) puis Run/Run Module. Prenez l'habitude de regrouper vos fonctions dans votre propre bibliothèque (par exemple dans un chier MaBibliotheque.py) an de les séparer du code principal (par exemple CodePrincipal.py) qui commencera par : # −∗− coding : Latin −1 −∗− import from os MaBiblotheque ∗ import Insérez le code principal et terminez par : os . system ( " pause " ) Pour tester une fonction MaBiblotheque.py if (ex : test(2)) de MaBibliotheque.py, ajoutez, à l'intérieur du chier MaBibliotheque.py depuis : __name__=="__main__" : test (2) os . system ( " pause " ) ainsi, la fonction CodePrincipal.py test(2) ne sera pas exécutée lorsque vous appelez Remarque : Le code principal et les bibliothèques sont interprétés à la volée. Il faut donc que Python soit installé. Pour créer un exécutable "stand-alone", utilisez un outil comme http://cx-freeze.sourceforge.net/). cx_Freeze (téléchargeable à : 2.2. 19 LEXIQUE 2.2.3 Lecture-écriture dans des chiers se déplacer dans l'arborescence des répertoires : import os os.chdir("C:/Documents and Settings") ouvrir un chier en mode lecture (r pour read) : MonFichier1=open("fichier1.txt","r") lire l'intégralité d'un chier ouvert : contenu=MonFichier1.read() créer un chier en mode écriture (w pour write) : MonFichier2=open("fichier2.txt","w") #si ce fichier existe déjà, il est écrasé ouvrir un chier en mode écriture à la suite (a pour append) : MonFichier3=open("fichier3.txt","a") écrire une chaine de caractères dans un chier : MonFichier2.write("Ecrire") MonFichier1.close() fermer un chier : Pour écrire des données en mode binaire (b pour binary) : import pickle n o t e s ={ #b i b l i o t h è q u e pour l i r e et écrire n ' importe quel objet " informatique " :20 , " physique " : " maths " : "S . I " : " arts 19 , 18 , 17 , plastiques " :2 , } with o p e n ( ' n o t e s . d a t ' , ' wb ' ) as MonFichier : #l e s notes seront é c r i t e s dans le f i c h i e r notes . dat en binaire M o n P i c k l e r=p i c k l e . P i c k l e r ( M o n F i c h i e r ) #Pickler est un objet que l 'on va écrire dans MonFichier M o n P i c k l e r . dump ( n o t e s ) #écriture des notes Pour lire des données en mode binaire (b pour binary) : import with #b i b l i o t h è q u e pour l i r e et écrire n ' importe quel objet as MonFichier : #l e s notes seront lues à partir du f i c h i e r notes . dat en binaire M o n D e p i c k l e r=p i c k l e . U n p i c k l e r ( M o n F i c h i e r ) #Unpickler est un objet que l 'on va l i r e à partir de MonFichier pickle open ( ' n o t e s . dat ' , ' rb ' ) n o t e s=M o n D e p i c k l e r . l o a d ( ) 2.2.4 Utilisation des bibliothèques NumPy, SciPy, SymPy, MatPlotLib NumPy SciPy PyLab PyPlot MatPlotLib SymPy La bibliothèque matrice,. . .) ; est notamment utile pour gérer les problèmes d'algèbre linéaire (vecteur, pour le traitement du signal ; les sous-bibliothèques et MatPlotLib MatLabR R MatLab SciLab Plotting pour les graphiques 2D et 3D (ainsi que pour les fonctions de est que la syntaxe est très proche de ). L'intérêt de la bibliothèque et donc de cette méthode pour les représentations graphiques par rapport au module . . Nous privilégierons de la bibliothèque Dans toute la suite, nous importerons ces bibliothèques avec les mêmes conventions que savoir : import import import import numpy as np scipy as sp matplotlib as mpl matplotlib.pyplot as plt Spyder , à 20 CHAPITRE 2. INTRODUCTION À PYTHON from pylab import * Vecteur - matrice création : MonVecteur= np.array([]) aectation : vecteur en ligne : MonVecteurLigne=np.array([1,2,3]) MonVecteurColonne=np.array([[1],[2],[3]]) vecteur en colonne : matrice : MaMatrice=np.array([[1,2,3],[4,5,6],[7,8,9]]) ou MaMatrix=np.matrix([[1,2,3],[4,5,6],[7,8,9]]) np.matrix permet d'appliquer des méthodes spéciques aux matrices ; on peut passer de array à matrix par np.asmatrix(MaMatrice) et réciproquement par np.asarray(MaMatrix) . création automatique : création d'un vecteur correspondant à progression arithmétique : MonVecteurLigne=np.arange(1,10,2) # (début,fin,incrément) MonVecteurLigne=np.linspace(1,9,5) # (debut,fin,NbreElements) création d'une matrice aléatoire (éléments entre 0 et 1) de 2 lignes et 3 colonnes : création d'une matrice nulle de 2 lignes et 3 colonnes : np.random.rand((2,3)) np.zeros((2,3)) np.eye(3,3) M (i, j) = f (x(i), y(j)) ; ex : f (x, y) = x2 + 2.y 3 création d'une matrice identité de dimension 3 : création de la matrice m×n telle que : x = np.arange(-5, 5, 0.25) y = np.arange(-5, 5, 0.25) X, Y = np.meshgrid(x, y) Z=np.square(X)+2*np.power(Y,3) voir une application au graphiques à 3 dimensions. MaCopie=MonVecteur.copy() ou MaCopie=np.copy(MonVecteur) MaCopie=MonVecteur les modications appliquées à MaCopie aussi à MonVecteur. création d'une copie : ATTENTION : si vous faites : s'appliqueront accession à un élément : MaMatrice[1,2] #élément 2ème ligne, 3ème colonne (à partir de l'index 0) accession à un élément indexé à partir de la n (index négatif ) : MonVecteurLigne[-1] # dernier élément accession à une ligne : MaMatrice[1,:] #2ème ligne MaMatrice[:,2] #3ème colonne élément : MaMatrice[1,2]=10 accession à une colonne : modication d'un suppression d'un élément : np.delete(MonVecteur,1) #supprime le 2eme élément (on indique la valeur de l'index) concaténation : MonVecteur=np.concatenate((MonVecteur,np.arange(5,8))) sélection d'une sous-matrice : MaMatrice[0:2,0:2] # LigneDebut:NbreLigne,ColonneDebut:NbreColonne (à partir de 0) nombre d'éléments d'un vecteur ou d'une matrice : size(MonVecteurLigne) # nombre total d'éléments dimensions d'une matrice : np.shape(MaMatrice) #(NbreLignes,NbreColonnes) reformatage d'une matrice : MonVecteurColonne=MonVecteurLigne.reshape(size(MonVecteurLigne),1) une méthode plus élégante en ajoutant une dimension pour transformer le vecteur en matrice : MonVecteurColonne=MonVecteurLigne[:,np.newaxis] 2.2. 21 LEXIQUE si vous voulez un vecteur distinct, utilisez np.copy(...) parcours des éléments d'un vecteur en précisant l'index : for element in enumerate(MonVecteur): print(element) opérations multiples sur un vecteur : MonVecteur=np.array([1,4,7]); np.square(MonVecteur) # crée le vecteur [1,16,49] np.array([element**2 for element in MonVecteur if element%2==0]) # donne [16] comparaison globale : v1=np.array([1,2,3]);v2=np.array([1,2,4]);np.array_equal(v1,v2) # False comparaison terme à terme : v1=np.array([1,2,3]);v2=np.array([1,2,4]);v1==v2 # True True False recherche dans un tableau : f=lambda x: x<3 np.array(list(filter(f,MonVecteur))) #renvoie les éléments correspondants tri d'un tableau : np.sort(MonVecteur) #np.sort(MonVecteur)[::-1] pour le sens décroissant passage d'un tableau à un ensemble (sans élément redondant) : somme des éléments d'un vecteur : unique(MonVecteurLigne) np.sum(MonVecteurLigne) np.sum(MaMatrice,axis=0) #addition verticale somme des lignes d'une matrice : somme des colonnes d'une matrice : produit des éléments d'un vecteur : np.sum(MaMatrice,axis=1) #addition horizontale np.prod(MonVecteurLigne) np.vdot(MonVecteur1,MonVecteur2) produit scalaire de deux vecteurs : produit vectoriel de deux vecteurs : np.cross(MonVecteur1,MonVecteur2) produit extérieur : v1=np.array([1,2,3]);v2=np.array([4,5,6]);t=np.outer(v1,v2) #construction de la table t[i,j]=v1[i].v2[j] inverse d'une matrice : np.linalg.inv(MaMatrice) transposé d'une matrice : np.transpose(MaMatrice) transposé conjugué d'une matrice : np.conjugate(np.transpose(M)) avec le type matrix : MaMatrix.getH() multiplication d'une matrice : np.dot(MaMatrice,MaMatrice) #multiplication matricielle ATTENTION avec le type matrix : MaMatrix*MaMatrix #multiplication matricielle MaMatrice*MaMatrice #multiplication élément par élément division d'une matrice : np.dot(MaMatrice,np.linalg.inv(MaMatrice)) #multiplication matricielle par l'inverse MaMatrice/MaMatrice #division élément par élément résolution d'un système linéaire : np.linalg.solve(MaMatrice,MonVecteur) Polynôme création à partir des coecients : création à partir des racines : degré : MonPoly=np.poly1d(np.poly([1,1,2])) MonPoly(1) MonPoly.order évaluation en x=1 : MonPoly=np.poly1d([2,1,1]);print(MonPoly) pour pour 2.x2 + x + 1. (x − 1)2 .(x − 2). 22 CHAPITRE 2. dérivation : primitive : racines : INTRODUCTION À PYTHON np.polyder(MonPoly) np.polyint(MonPoly)#avec cte=0 np.roots(MonPoly) régression linéaire : x=np.linspace(0,1,10);y=np.linspace(0,2,10); np.poly1d(np.polyfit(x,y,1)) #1 pour linéaire, 2 pour quadratique,... création d'une fraction rationnelle : den=np.poly1d([4,2,3]) num=den*np.poly1d([1,2,3]) MaFraction=num/den print(MaFraction[0]) #quotient print(MaFraction[1]) #reste de la division euclidienne Graphiques "b"=bleu (par défaut), "k"=noir, "r"=rouge, "g"=vert, "c"=cyan, "m"=magenta, "y"=jaune, "w"=blanc. points non reliés : ".", "+", "o", "x", "*" points reliés : ".-","+-","o-","x-","*-" pointillés : "","-.",":" couleurs : sélectionner une fenêtre graphique : MaFigure1=plt.figure() # crée une fenêtre et la sélectionne acher la fenêtre graphique : eacer la fenêtre graphique : plt.show() plt.clf() #clear figure faire apparaître un quadrillage : dénir les axes : plt.grid(True) plt.axis([0, 5, 0, 10]) # forme([xmin,xmax,ymin,ymax]) tracer un point de coordonnées (1; 2), en forme de cercle, en rouge : plt.plot(1,2,"or") tracer un nuage de points, en forme d'étoile : plt.plot([2,4,6],'*') # forme ([1,2,3,...],[y1,y2,y3,...]) plt.plot([1,3], [2,4],'*') #forme ([x1,x2],[y1,y2]) (1; 2) et (3; 4) : plt.plot([1,3], [2,4]) #forme ([x1,x2],[y1,y2]) 2 tracer la fonction f (x) = x + 2.x + 3 pour x ∈ [−1, 3] : tracer un segment entre les points x=np.linspace(-1,3,100) #génère des 100 pts dans l'intervalle [-1,3] plt.plot(x,x**2+2*x+3) plt.xlabel('abscisse') plt.ylabel('ordonnée') plt.title('titre') plt.show() ou bien à partir de SymPy from sympy import symbols from sympy.plotting import plot x = symbols('x') plot(x**2+2*x+3, (x, -1, 3)) 2.2. 23 LEXIQUE tracer les deux fonctions f (x) = cos(x) et g(x) = sin(x) sur la même gure : x=np.linspace(0,2*pi,100) # génère 100 points dans l'intervalle [0,2.pi] plt.plot(x,np.cos(x),x,np.sin(x)) axis("tight") #adaptation automatique de l'échelle (auto-scale) ou bien : x=np.linspace(0,2*pi,100) plt.plot(x,sin(x),label='sin') plt.plot(x,cos(x),label='cos') plt.legend() plt.show() ou bien encore : x=np.linspace(0,2*pi,100) # génère 100 points dans l'intervalle [0,2.pi] f,=plt.plot(x,np.cos(x)) #liste dont le premier élément est f g,=plt.plot(x,np.sin(x)) #idem avec g plt.legend([f, g], ["cosinus", "sinus"]) #à mettre dans l'ordre plt.show() tracer les deux fonctions f (x) = cos(x) et g(x) = sin(x) sur deux gures l'une en dessous de l'autre : x=np.linspace(0,2*pi,100) # génère 100 points dans l'intervalle [0,2.pi] plt.figure(1) # figure 1 plt.subplot(211) # dans la figure en cours, créer une sous-figure: NL,NC,NSF #on obtient une grille (NL=nbre de lignes,NC=nbre de colonnes) #où l'on place la sous-figure NSF=num sous figure (entre 1 et NL*NC) plt.plot(x,np.cos(x)) plt.subplot(212) # même grille, 2eme sous-figure plt.plot(x,np.sin(x)) plt.show() pour avoir 2 gures côte à côte : subplot(1,2,1) et subplot(1,2,2) tracer un graphique en échelle log-log : x=np.logspace(1,3,10) plt.loglog() plt.plot(x,x**2) plt.show() tracer la courbe paramétrée x = sin(t), y(t) = cos(t), z(t) = 2.t from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.gca(projection='3d') t=linspace(0,6*pi,100); x=np.sin(t) y=np.cos(t) z=2*t ax.plot(x,y,z) plt.show() sur un graphique à 3 dimensions : 24 CHAPITRE 2. tracer z = x2 + 2.y 3 INTRODUCTION À PYTHON sur un graphique à 3 dimensions : from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.gca(projection='3d') ax.set_xlim3d(-1,1) ax.set_ylim3d(-1,1) x=np.linspace(-1,1,100) y=np.linspace(-1,1,100) X, Y = meshgrid(x,y) Z=np.square(X)+2*np.power(Y,3) surf = ax.plot_surface(X,Y,Z) plt.show() tracer les courbes de niveaux de sin(π.x).cos(π.y) pour x ∈ [0, 1] et y ∈ [−1, 1] : nx,ny= 32,32 x = linspace(0,1,nx) y = linspace(-1,1,ny) X, Y = meshgrid(x,y) F = sin(pi*X)*cos(pi*Y) cs = contourf(X,Y,F) Si la gure ne s'ache pas dans la fenêtre, cliquez sur gure options" et Apply. Calcul symbolique from sympy import * x=symbols("x") y=symbols("y") Commencez par : évaluer numériquement : pi.evalf() #valeur numérique de pi développer une expression : simplier une expression : calculer une limite : expand((x+y)**3) simplify((x+x*y)/x) limit(sin(x)/x, x, 0) limit(1/x, x, oo) #oo=infini diff(cos(2*x), x) diff(cos(2*x), x,2) #dérivée seconde dériver une expression : intégrer une expression : integrate(sin(x), x) integrate(x**3, (x, -1, 1)) #en précisant les bornes series(cos(x), x,0,3) #en x=0 à l'ordre 3 une équation=0 : solve(x**4+2*x-1, x) un système : solve([2*x+5*y-2,4*x-7*y-8],[x,y]) développer en série de Taylor : résoudre résoudre factor(x**4+4*x**3+6*x**2+4*x+1) diérentielle : f=Function("f");dsolve(diff(f(x),x, 2)+f(x),f(x)) factoriser un polynôme : résoudre une équation 2.2. 25 LEXIQUE Calcul numérique trouver une racine par dichotomie (ex : x = − cos x pour x ∈ [−π, π]) : import scipy.optimize f=lambda x:x+cos(x) scipy.optimize.bisect(f,-pi,pi) #f,xmin,xmax R2 calculer une intégrale (ex : x2 .dx) : x=1 import scipy.integrate derivee=lambda x:x**2 resultat,erreur=scipy.integrate.quad(derivee,1,2) #derivee,xmin,xmax résoudre une équation diérentielle du 1 er ordre (ex : df dt = −5.f (t) avec f (0) = 10) import scipy.integrate derivee=lambda f,t: -5*f f0=10 t=linspace(0,2,100) f_numerique=scipy.integrate.odeint(derivee,f0,t) plt.plot(t,f_numerique) résoudre un système d'équations diérentielles du premier ordre (ex : ci-dessous) dx dt = 1 + 2.x(t).y(t) − 3.x(t) dy dt = 2.x(t).y(t) + 4.z(t) − 5.x(t).y(t) dz dt = 3.x(t) + 5.x(t).y(t) − 4.z(t) avec x(0) = 1 y(0) = 2 z(0) = 3 import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint # on crée un vecteur coords=[x,y,z] # système d'équations d(coords)/dt = f(coords, t) def equadiff(coords, t): x = coords[0]; y = coords[1]; z = coords[2] vx = 1+2*x*y-3*x vy = 2*x*y + 4*z - 5*x*y vz = 3*x + 5*x*y - 4*z return [vx, vy, vz] # conditions initiales x0 = 1.; y0 = 2.; z0 = 3. coords0 = [x0, y0, z0] t = np.linspace(0, 1., 1000) # résolution du système soln = odeint(equadiff, coords0, t) x = soln[:, 0]; y = soln[:, 1]; z = soln[:, 2] # graphique plt.figure() plt.plot(t,x,t,y,t,z) axis([0,1,0,5]) : 26 CHAPITRE 2. ⇒ transformer 0 en système = −g z (0) = 0 avec z(0) = 10 = z 0 (t) résoudre une équation diérentielle du second ordre d2 z ex : 2 d t = −g ⇒ on pose 0 z = dz dt et l'on a : dz0 dt dz dt INTRODUCTION À PYTHON du premier ordre import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint # on crée un vecteur coords=[z,z'] # système d'équations d(coords)/dt = f(coords, t) def equadiff(coords, t): z = coords[0] vz = coords[1] az = -9.81 return [vz, az] # conditions initiales z0 = 10. vz0 = 0. coords0 = [z0, vz0] t = np.linspace(0, 2., 1000) # résolution du système soln = odeint(equadiff, coords0, t) z = soln[:, 0] vz = soln[:, 1] # graphique plt.figure() plt.plot(t,z) axis([0,2,0,10]) prendre le gradient d'un champ scalaire from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from pylab import * x = linspace(-3, 3, 100) y = linspace(-3, 3, 100) X, Y = meshgrid(x, y) Ep = exp(-(X**2+Y**2)) Fy,Fx=gradient(Ep) Fx=-Fx;Fy=-Fy Quiv=quiver(X[::2,::2],Y[::2,::2],Fx[::2,::2],Fy[::2,::2]) #tous les 2pts plt.show() 2.2. LEXIQUE prendre le Laplacien d'un champ scalaire from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from pylab import * import numpy as np from scipy import ndimage gabarit = np.array([[0, 1, 0],[1, -4, 1], [0, 1, 0]]) x = np.linspace(-3, 3, 100) y = np.linspace(-3, 3, 100) X, Y = meshgrid(x, y) F = exp(-(X**2+Y**2)) Laplace = ndimage.convolve(F, gabarit)/(x[1]-x[0])**2 fig = plt.figure() ax = fig.gca(projection='3d') surf= ax.plot_surface(X,Y,Laplace) plt.show() 27
Documents pareils
Maths et Python - Apprendre en ligne
Les opérations classiques sur la matrices sont disponibles à l’aide de numpy : addition, multiplication par un scalaire, produit matriciel...Le code 5 présente quelques exemples de ces opérations.
Bibliothèques scientifiques de Python : une introduction
Le module est riche, et foisonnant. Nous nous attacherons à montrer, sur quelques exemples, les
éléments les plus couramment utilisés.
Commençons par tracer quelques courbes, en variant leur représ...
Introduction à Python pour la programmation scientifique
ça serait dommage de ne pas s'en servir
v2.3 cette année ! (notebooks etc)
http://ipython.org
Python - introduction à la programmation et calcul scientifique
le logiciel lui-même ait été correctement installé).
Les trois caractères « supérieur à » constituent le signal d’invite, ou prompt principal, lequel vous
indique que Python est prêt à exécuter une...