Calcul Scientifique
October 8, 2014
0.0.1 Journ´ee `a la d´ecouverte de Python
1 Python pour le Calcul Scientique
Dev@LR - R´emy Mozul
2 Sommaire
Introduction
Plus de python
Numpy
Scipy
Matplotlib
Code compil´e
2.1 Introduction
Ipython
R`egles de d´eveloppement
Documentations existantes
2.1.1 ipython
Interactive python
Surcouche `a l’interp´eteur python classique
Compl´etion automatique
Aide interactive
Support des commandes shell (pour les Unixiens)
Meilleure gestion de l’historique des commandes
In [1]: import math
math?
!ls -l #unix
#! dir #dos
total 616
-rw-r--r-- 1 mozul staff 219706 8 oct 10:49 Calcul Scientifique.ipynb
-rw-r--r--@ 1 mozul staff 856 8 sep 16:47 fixed mathjax.tpl
-rw-r--r--@ 1 mozul staff 2515 1 oct 10:35 latex-to-slide-patch.tar.gz
-rw-r--r--@ 1 mozul staff 72229 22 sep 17:56 numpy indexing.png
1
-rw-r--r-- 1 mozul staff 97 1 oct 10:41 run slides.sh
-rw-r--r--@ 1 mozul staff 5095 8 sep 16:47 slides.tpl
2.1.2 R`egles de d´eveloppement
Python offre beaucoup de libert´es
Peut-ˆetre trop parfois !
Important de se fixer des r`egles :
Conventions de nommage
Toujours documenter ses fonctions/classes (docstring)
Tests
Les conseils officiels : http://legacy.python.org/dev/peps/pep-0008/
In [2]: import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let’s do more of those!
2.1.3 Documentation
Enorm´ement de documentation en ligne : https://docs.python.org/3/
Tutoriaux
Documentation des modules/fonctions
Code sources des modules
Recherche internet
De module existant
De r´esolution de probl`eme
2.2 Plus de python
Indexation des listes
List comprehension et lambda functions
Filter, map
2
2.2.1 Indexation des listes
indexation commence `a 0
op´erateur d’indexation [debut:fin:pas]
end est non inclus dans la selection
si l’index iest n´egatif, il est interpr´et´e comme n+j (o`u nest la taille)
si les entiers entre les :sont omis, les valeurs par d´efaut 0, taille de la liste et 1 sont utilis´ees
syntaxe utilisable avec le constructeur range(debut,fint,pas)
Exercice :
G´en´erer une liste allant de 0 `a 9 (avec la fonction range et le constructeur de list)
Afficher le premier ´el´ement, le dernier, l’avant dernier
A partir de celle-ci, cr´eer une liste
allant de 0 `a 4
allant de 4 `a 9
contenant les nombres pairs
contenant les nombres impairs dans l’ordre d´ecroissant jusqu’`a 3
G´en´erer une liste de nombre pairs allant de 2 `a 10
In [3]: #python 2
#l = range(10)
#l = list(xrange(10))
#python 3
l=list(range(10))
print(l[0]); print(l[-1]); print(l[-2])
a=l[:]; print(a)
a=l[:5]; print(a)
b=l[4:]; print(b)
c=l[::2]; print(c)
d=l[9:2:-2]; print(d)
l2=list(range(10,1,-2)); print(l2)
0
9
8
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4]
[4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8]
[9, 7, 5, 3]
[10, 8, 6, 4, 2]
2.2.2 List comprehension et lambda function
Mani`ere classique de g´en´erer une liste : avec une boucle for et la m´ethode append
List comprehension : mani`ere compacte de g´en´erer des listes en une ligne
Utilise une sequence ou un it´erateur
Syntaxe : [ ] contenant une expression suivi de 0 ou plus for ou if mots-clef
Lambda function : mani`ere compacte de g´en´erer des petites fonctions anonyme en une ligne (utile
quand une fonction est un param`etre d’une autre)
3
Syntaxe : lambda args : expression(args)
Exercice :
Cr´eer, avec une boucle, une liste contenant sin(x) pour des valeurs xparcourant 0 `a 1 par pas de 0.1
Cr´eer la mˆeme liste en une seule ligne
Cr´eer une fonction fr´ef´erencant une lambda function faisant sin(x2)
Cr´eer une liste contenant sin(x2) pour des valeurs xparcourant 0 `a 1 par pas de 0.1 en utilisant f
In [4]: import math
s=[]
for xin range(11):
s.append(math.sin(x*0.1))
s2 =[math.sin(x*0.1)for xin range(11)]
print(s == s2)
f=lambda x : math.sin(x*x)
s3 =[f(x*0.1)for xin range(11)]
True
2.2.3 filter et map
2 fonctions qui prennent en entr´ee une fonction et une liste. En python 3, la valeur de retour est un objet
permettant de cr´eer des liste. En python 2, la valeur de retour est un objet list.
Filter : retourne la liste des ´el´ements d’entr´ee dont l’´evaluation par la fonction est vraie ->le r´esultat
de la fonction est interpr´et´e comme un bool´een
Map : retourne l’´evaluation par la fonction de chaque ´el´ement de la liste d’entr´ee
Note : En g´en´eral, quand il existe des syntaxes ´equivalentes, la list comprehension est plus rapide que les
filter/map/, qui sont plus rapide que les boucles
Exercice : Tester les 2 fonctions :
r´ecup´erer une liste d’entier dont tout les ´el´ements sont divisibles par 3
r´ecup´erer une liste correspondant `a sin(x) o`u x est une autre liste.
In [5]: l1 =list(filter(lambda x: x%3==0,range(15)))
print(l1)
l2 =list(map(math.sin,l1))
print(l2)
[0, 3, 6, 9, 12]
[0.0, 0.1411200080598672, -0.27941549819892586, 0.4121184852417566, -0.5365729180004349]
2.3 Numpy
Introduction
Tableau : type, attribut, m´emoire
Indexing/Slicing
Vue : ef´erence/copy
Constructeurs, IO
Manipulation
4
2.3.1 Introduction
Package pour le traitement de tableau `a n-dimensions
Pens´e pour le calcul scientifique
Efficace
Restrictions :
Taille totale du tableau fixe
Type des ´el´ements homog`ene
Type statique
Site officiel (avec documentation et tutoriaux) : http://docs.scipy.org/doc/numpy/user/
2.3.2 Type
Les tableaux numpy sont optimis´es pour le traitement de valeurs num´eriques :
bool´eens (32/64)
entiers non sign´es (32/64)
entiers sign´es (32/64)
r´eels (32/64)
complexes (32/64 bits)
Lors de la cr´eation d’un tableau, le type des ´el´ements peut ˆetre :
choisi ou inf´er´e par le constructeur
sp´ecifi´e
L’attribut de la classe array qui stocke le type est dtype.
Exercices :
Utiliser le constructeur de la classe array pour cr´eer
une vecteur d’entiers
un vecteur de r´eels.
V´erifier le type du contenu du chacun des tableaux grˆace `a la l’attribut dtype.
In [6]: import numpy as np
np?
In [7]: a=np.array([1,2,3])
print(a)
print(a.dtype)
[1 2 3]
int64
In [8]: b=np.array( [[1.2,2.3,3.4],[4.5,5.6,6.7]])
print(b)
print(b.dtype)
[[ 1.2 2.3 3.4]
[ 4.5 5.6 6.7]]
float64
5
1 / 19 100%