Vous êtes sur la page 1sur 14

Programmation scientique avec Python

2022-2023/ jacques.beilin@ensg.eu

Table des matières


1 Avant-propos 2

2 L'environnement python 2

3 Numpy 3
3.1 Construction des vecteurs et des matrices . . . . . . . . . . . . . . . . . . . . 3
3.2 Accès aux éléments et extractions des matrices . . . . . . . . . . . . . . . . . . 5
3.3 Opérations sur les matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4 pandas 6
4.1 Structure des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4.2 Import des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4.3 Création d'un dataframe vide et remplissage . . . . . . . . . . . . . . . . . . . 7
4.4 Informations générales sur le dataframe créé . . . . . . . . . . . . . . . . . . . 7
4.5 Accès aux données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.6 Itérer dans un dataframe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.7 Sélections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.8 Statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.9 Expressions régulières dans un dataframe . . . . . . . . . . . . . . . . . . . . . 9
4.10 Écriture des résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
5 Structures de contrôle 10

6 Programmation orientée objet 11

7 Chaînes de caractères 12

1
8 Graphiques 13

9 Lecture de chiers 14

10 Le temps 14

1 Avant-propos
Python-numpy permet d'accéder, au prix d'une complexité informatique légèrement plus grande
aux fonctionnalités de calcul numérique présentes dans des outils comme Gnu-Octave ou Matlab.
Cependant, il permet plus facilement de déboucher sur des outils de qualité professionnelle, au
delà du prototypage, domaine d'élection de Matlab.
La documentation de l'ensemble des fonctions de numpy est disponible à l'adresse http://
docs.scipy.org/doc/numpy/reference/.

2 L'environnement python
1. Interface : invite de commande sous spyder
2. Dénition d'une variable et premières opérations
1 a = 3
b = 2
3 a* b
a* *4

3. Fonctions mathématiques de base (scalaires) : math.sqrt, math.sin, math.cos, math.log,


math.exp, math.factorial, fractions.gcd, math.ceil, round, math.floor, math.fmod
4. Constantes : math.pi, math.e, j, inf, nan, False, True
5. Accéder au descriptif d'une fonction : help(m.cos)
import math as m
2 help ( m. sin )

6. Formatage des valeurs numériques : %, chaines %s, ottants %n.mf, entiers %d


print (" %s %.4 f %02 d" % ( ' foo ', math .pi ,4) )

7. Fichiers scripts : chier d'extension .py. Exécution par appel dans le shell depuis le
répertoire contenant le chier python3 toto.py ou commande d'exécution de l'IDE
1 [ toto . py ]
import math
3 a= math . pi /4

2
math . sin (a)

8. Gestion des répertoires :


 connaitre le répertoire courant
import os
2 print ( os . getcwd () )

 changer de répertoire
import os
2 os . chdir ( '/ home / documents ')

 lister répertoire
import os
2 os . listdir ( '/ home / documents ')

9. conventions d'écriture
module_name , package_name , ClassName , method_name ,
ExceptionName , function_name , GLOBAL_CONSTANT_NAME ,
global_var_name , instance_var_name ,
function_parameter_name , local_var_name

3 Numpy
3.1 Construction des vecteurs et des matrices

1. Dénition de vecteurs et de matrices :


1 import numpy as np
# Creation a partir de liste
3 VListe = [1 ,2 ,3]
Vliste . append (45)
5 Vligne = np . asarray ( Vliste )

7 # Creation directement en tant que ndarray


Vligne = np . array ([1 ,2 ,3])
9

Vcolonne = np . array ([4 ,5 ,6]) . reshape ( -1 ,1)


11 Vcolonne = np . array ([[4] ,[5] ,[6]])
Vcolonne = np . array ([4 ,5 ,6]) . reshape (1 , -1) .T
13 M = np . array ([[1 ,3 ,5] ,[2 ,4 ,6]])

2. Dimensions des vecteurs et matrices : shape


3
1 N = np . array ([[4 ,5 ,6] ,[1 ,3 ,5] ,[6 ,7 ,1]]
dim = N. shape
3 nl = dim [0]
nc = dim [1]
5

np . squeeze (M )
7

V = np . linspace (1 ,5 ,3)
9

M1 = V [: , None ]
11 M1 = V [: , np . newaxis ]
# [[ 1.]
13 # [ 3.]
# [ 5.]]
15 M2 = V[ np . newaxis ,:] # [[ 1. 3. 5.]]

3. transposée : np.transpose() ou .T
4. réplication : np.repeat()
5. concaténation : np.concatenate(), np.hstack(), np.vstack()
6. Dénition par valeurs espacées : np.range(), np.arange(), np.linspace()
a= np . arange (5) # [0 1 2 3 4]
2 a= np . arange (1 ,5) # [1 2 3 4]
a= np . arange (1 ,5 ,0.5) # [ 1. 1.5 2. 2.5 3. 3.5 4.
4.5]
4

b= np . linspace (1 ,5 ,6) # [ 1. 1.8 2.6 3.4 4.2 5. ]

7. Suppression d'éléments : opérateur []


1 V = np . array
([4.8 ,5.6 ,6.0 ,7.8 ,11 ,4 ,5 ,6 ,33.0 ,6.9 ,7.9 ,8.8 ,9.3 ,10.8])
V = V[V < 7.3]

8. Matrices particulières : np.ones(), np.eye(), np.zeros(),


a= np . ones ((4 ,5) )
2 a= np . zeros ((1 ,5) )
I4 = np . eye (4)

9. Matrices de nombres aléatoires : np.random.rand(), np.random.randn()


1 a= np . random . rand (4 ,5)

4
a= np . random . randn (1 ,5)

10. Lecture de données tabulées


import numpy as np
2 data = np . genfromtxt (" gcp . txt " , delimiter = " ," )

3.2 Accès aux éléments et extractions des matrices

1. Accès aux éléments


A [0] # premier element
2 A [ -1] # dernier element
M [2 ,1]
4 M [2 ,0:2]

6 L= np . random . rand (4 ,5)


id1 = [0 ,2]
8 id2 =[0 ,2]
L[ id1 , id2 ] # extraction stricte des intersections
10 L[ np . ix_ ( id1 , id2 )] # extraction large des intersections

2. Structures conditionnelles sur un vecteur ou une matrice : np.any, np.all, np.argwhere


if np . any (V <0.001) :
2 blabla ...

4 if np . all (V >0.001) :
blabla ...

3. Extraction de matrice sur une condition


A = np . array ([[ 0.061 , 0.019 , 0.357 , 0.811 , 0.957] ,
2 [ 0.594 , 0.261 , 0.875 , 0.019 , 0.309] ,
[ 0.201 , 0.944 , 0.352 , 0.055 , 0.495] ,
4 [ 0.644 , 0.538 , 0.623 , 0.484 , 0.110] ,
[ 0.982 , 0.099 , 0.140 , 0.104 , 0.067]])
6

# * => and
8 # + => or
B = 2.0 * (( A >=0.0) * (A <0.25) + (A >0.75) * (A <=1) )
10 # B = [[ 2. 2. 0. 2. 2.]
# [ 0. 0. 2. 2. 0.]
12 # [ 2. 2. 0. 2. 0.]
# [ 0. 0. 0. 0. 2.]

5
14 # [ 2. 2. 2. 2. 2.]]

4. Fonction tests : np.isnan np.isinf np.where


3.3 Opérations sur les matrices

1. Opérations terme à terme : +, -, *, /, **


2. Produit matriciel : np.dot, @
N = np . array ([[4 ,5 ,6] ,[1 ,3 ,5] ,[6 ,7 ,1]])
2 P = np . array ([[1 ,3 ,5] ,[4 ,5 ,6] ,[6 ,7 ,1]])
np . dot (N , P)
4 M = N @ P
N* P
6 N* *2

3. Fonctions mathématiques : np.sqrt, np.sin, np.cos, np.log, np.exp,


4. Fonctions statistiques :
 minimum : np.min
 maximum : np.max
 moyenne : np.mean
 somme : np.sum
 somme cumulée : np.cumsum
 écart-type : np.std
5. Fonctions matricielles :
 norme : np.linalg.norm
 inverse : np.linalg.inv
 déterminant : np.linalg.det
 vecteurs propres : np.linalg.eig
D = np . linalg . det (N )
2 invN = np . linalg . inv (N )
valN , vecN = np . linalg . eig ( N)

4 pandas
La bibliothèque pandas est spécialisée dans l'analyse de données. Elle est complémentaire de
numpy. Pour les usages de la géomatique, les deux biliothèques -numpy et pandas- sont très
complémentaires.
Pandas permet de gérer/stocker/analyser la donnée et on va débrancher sur numpy dès lors
que des traitements numériques son eectués.
6
4.1 Structure des données

La structure de base sous pandas est le dataframe. Le dataframe peut être vu comme un
tableau accessible par des indices ou des noms de lignes/colonnes.
4.2 Import des données

1 # !/ usr / bin / python


# -* - coding : iso -8859 -15 -* -
3 import pandas as pd
data = pd . read_csv ( os . path . join ( path , ' data . txt ') , delimiter = '
; ')

Si les noms des colonnes ne sont pas présents sur la première ligne, on peut les dénir :
# !/ usr / bin / python
2 # -* - coding : iso -8859 -15 -* -
import pandas as pd
4 data = pd . read_csv ( os . path . join ( path , ' data . txt ') , delimiter = '
; ', names = [ " name " , " lat " , " lon " , " alti " , " num " ])

4.3 Création d'un dataframe vide et remplissage

import pandas as pd
2 import numpy as np

4 df = pd . DataFrame ([] , columns =[ "X " , " Y" ])

6 for i in range (10) :


rd = np . random . rand (2 ,)
8 df = df . append ({ " X" : rd [0] , "Y ": rd [1]} , ignore_index =
True )

4.4 Informations générales sur le dataframe créé

1. Visualisation des premières lignes


print ( data . head () )

2. Visualisation des dernières lignes


1 print ( data . tail () )

3. Récupération des colonnes


7
1 print ( data . columns )

4. Information sur les données


1 print ( data . info )

5. Dimensions du tableau
1 print ( data . shape )

4.5 Accès aux données

1. Récupération d'une colonne


1 df2 = data [ ' name ']

Si le contenu est numérique, il est possible de convertir le dataframe résultat en array


numpy
1 df2 = data [ 'x ']
# ou
3 df2 = data .x

5 # conversion d ' un dataframe en array


M = np . array ( df2 )
7 VX = np . array ( df2 .X)
# Insertion d 'un vecteur dans un dataframe ( ici une
nouvelle colonne )
9 df2 . X2 = VX . tolist ()

2. Récupération de plusieurs colonnes


1 df2 = data [ ' name ', "x" ]

3. Récupération d'une partie de dataframe


1 df = data . loc [:5 , [" pt_vise " , "x" , "y " , " z" ]]

3 df2 = data . loc [3 , :]

4.6 Itérer dans un dataframe

1. Itérer sur les colonnes


1 for col in df . columns :
print ( df [ col ]. dtype )

8
2. Itérer sur les lignes (sur les index)
for i in data . index :
2 phiA = data . loc [i , ' latitude ']
lonA = data . loc [i , ' longitude ']

4.7 Sélections

1. Sélection sur un attribut par valeur égale


1 df = data . loc [ data [ ' type ' ]== " A" ,:]

3 df = data . loc [( data [ ' type1 ' ]== "A ") & ( df [ ' type2 '] == " Z")
,:]

2. Sélection sur un attribut par seuil


1 df2 = dfCore . query ( ' longitude < 45 and longitude > -45 and
latitude > -45 and latitude < 45 ')

3 df3 = dfCore [( dfCore [ ' longitude '] < 45) & ( dfCore [ '
longitude '] > -45) & ( dfCore [ ' latitude '] > -45) & (
dfCore [ ' latitude '] < 45) ]

4.8 Statistiques

1. Statistiques complètes sur une colonne


1 print ( data ["x " ]. describe () )

2. Statistiques particulières sur une colonne : mean, max...


1 print ( data ["x " ]. mean () )

3. Tri
1 df2 = data [" x" ]. sort_values ()

1 df2 = data [" x" ]. argsort ()

4.9 Expressions régulières dans un dataframe

1. match
1 df2 = df [ df . name . str . match ( '^A. * ') ]

9
2. replace
1 df . name . replace ( ' MARSEILLE ' ,' LYON ', regex = True , inplace =
True )

3. split
1 df . name . split (r "s" , n = -1 , expand = False )

4.10 Écriture des résultats

1. Ecriture d'un chier


1 df . to_csv (" out . obs " , float_format =" %.3 f" , index_label = "
index " , sep =" ")

5 Structures de contrôle
1. Dénition des fonctions (format .py, ), sous-fonctions
1 # !/ usr / bin / python
# -* - coding : iso -8859 -15 -* -
3 import numpy as np
def ma_somme (x) :
5 x1 = np . squeeze ( x)
s = x1 . vdot ( x1 )
7 return s

9 print ( ma_somme (A ))

2. Structures itératives :
1 for i in range (10) :
blabla ...
3

for v in MyVector :
5 blabla ...

1 for OneElement in MyList : print ( OneElement )


L = [ OneElement +2 for OneElement in MyList ]

3. Opérateurs conditionnels : == ~= < > <= >= | & ~


4. Structures conditionnelles :
10
if a >2:
2

elif a >1:
4

else :

Test en mode ternaire


x = " True " if a >2 else " False "

5. Structures itératives conditionnelles


1 while condition :
instruction de la boucle

6. Exceptions
try :
2 print (5/0)
except Exception as e:
4 print (e , type ( e)) # division by zero < class '
ZeroDivisionError '>

6 Programmation orientée objet


1. Dénition minimaliste d'une classe
class point () :
2 """ point en cooldonnee X , Y """
def __init__ ( self , name ,X ,Y) :
4 self . name = name . strip ()
self . X=X
6 self . Y=Y

2. Ajout d'une méthode d'impression du contenu de la classe (pour débugger par exemple)
class point () :
2 """ point en cooldonnee X , Y """
def __init__ ( self , name ,X ,Y) :
4 self . name = name . strip ()
self . X=X
6 self . Y=Y

8 def print ( self ) :


""" Impression des attributs de la classe """

11
10 for s in self . __dict__ :
print ( '% -35 s : ' % (s) , self . __dict__ . get (s) )

3. Utilisation de cette classe


1 A = point ( 'A ' ,55 ,77) # creation d ' une instance A de la
classe point
A. print () # on imprime a l ' ecran les attributs a l '
aide de la methode print ()
3 x = A.X # recuperation des coordonnees
y = A.Y

7 Chaînes de caractères
1. Dénition : ' ' ou " "
2. Concaténation (+), modication (forcément par création d'une nouvelle chaîne), com-
paraison ('==')
s= ' foo '+ ' bar '
2 print (s ) # foobar

3. Opérations : recherche (find)


4. Conversion chaîne vers nombre ottant : (float())
s= ' 3.1416 '
2 x= float ( s)

5. Écriture formatée : %
s = '%s %6.4 f ' % ( 'x= ', pi ) # s = 'x= 3.1416 '
2 print (s ) # x= 3.1416

6. Écriture formatée d'un vecteur ou d'une matrice : np.set_printoptions


a = np . random . rand (2 ,2)
2 np . set_printoptions ( precision =3)
print (a )
4 # [[ 0.162 0.632]
# [ 0.271 0.561]]

1 a = np . random . rand (4 ,5)


s = np . array2string (a , max_line_width =80 , precision =2 ,
separator = ', ')
3 print (s )

12
7. Découpe de chaînes : re.split
1 import re
r = re . compile ( '[ \t \n\ r :]+ ')
3 mylist = r. split (" abc : def ghi ") # [' abc ', ' def ', ' ghi ']
for s in mylist :
5 print ( s) # ' abc ' puis ' def ' puis ' ghi '

8 Graphiques
1. package : import matplotlib.pyplot as plt
2. nouvelle gure : figure
3. tracé d'une fonction 2D
 tracé 2D avec axes classiques : plt.plot
1 import matplotlib . pyplot as plt
import numpy as np
3 x = np . linspace (0 ,2 * np .pi ,20)
y= np . sin (x)
5 plt . plot (x ,y , 'o - ')

 tracé 2D avec axe log : plt.semilogx, plt.semilogy


1 import matplotlib . pyplot as plt
import numpy as np
3 plt . figure ()
x2 = np . arange (0 ,10 ,0.1)
5 y2 = np . log ( x2 )
plt . semilogx (x2 , y2 )
7 plt . show ()

4. Tracé d'une fonction 3D : plot


1 import numpy as np
import matplotlib . pyplot as plt
3 from mpl_toolkits . mplot3d import Axes3D

5 x3 = np . arange (0 ,2 * math .pi ,0.1)


y3 = np . sin ( x3 )
7 z3 = np . cos ( x3 )
fig = plt . figure ()
9 fig . gca ( projection = '3d ')
plt . plot (x3 , y3 , z3 , label = ' parametric curve ')
11 plt . legend ()

13
plt . show ()

5. Tracé d'une fonction 3D : surf, contour


import numpy as np
2 import matplotlib . pyplot as plt
from mpl_toolkits . mplot3d import Axes3D
4 from matplotlib import cm

6 fig = plt . figure ()


ax = fig . gca ( projection = '3 d ')
8 surf = ax . plot_surface (X , Y , Z , cmap = cm . terrain )
plt . show ()

9 Lecture de chiers
1. Interaction avec des chiers open readlines close
1 with open ( filename ) as F:
lines = F. readlines ()

ou mieux :
try :
2 with open ( filename , encoding = 'utf -8 ', errors = ' replace ')
as F:
lines = F. readlines ()
4 except :
print ( ' Unable to open %s ' % ( filename ) )

10 Le temps
1. Dates : package gpsdatetime
1 import gpsdatetime as gps

3 t0 = gps . gpsdatetime ()
t1 = gps . gpsdatetime ()
5 t0 . ymdhms_t (1944 ,1 ,4)
t0 . print_dates ()
7 age =( t1 - t0 ) /86400/365.2425
print ( age )

14

Vous aimerez peut-être aussi