Python pour les scientifiques Thierry Chappuis
Les besoins du scientifique Les besoin du scientifique, dans son travail de tous les jours, se résument ainsi: Acquérir des données (simulation, expériences) Manipuler et traiter ces données Visualiser les résultats et les interpréter Communiquer les résultats: produire des figures pour des publications ou des présentations
Le cahier des charges Un outils de programmation adapté au scientifique doit posséder les caractéristiques suivantes: Riche collection d algorithmes et d outils de base (FFT, fitting, intégration numérique, visualisation, etc.) Facile à apprendre (la programmation n est pas notre job) Facile à communiquer avec les collaborateurs, étudiants, clients (le code doit se lire comme un libre et se rapprocher du langage mathématique) Exécution et développement efficaces Un seul environnement/langage pour toutes les problèmes de la vie courante
Les solutions existantes Langages compilés: C, C++, Fortran Avantages: compilateurs et bibliothèques très optimisés. Désavantage: usage difficile pour le scientifique. Langages de script: Matlab Avantages: riche collection d algorithmes environnement de développement plaisant, aide de qualité, support commercial. Désavantage: langage de programmation pauvre, cher. Autres langages de script: Scilab, Octave, R, IDL Avantages: moins cher que Matlab, domaines spécifiques avancés (statistiques dans R). Désavantages: moins d algorithmes que dans Matlab et langage pas plus évolué. Souvent dédiés à un domaine.
Qu en est il de python? Les avantages Une collection très riche de bibliothèques scientifiques Un langage de programmation bien conçu et lisible Beaucoup de bibliothèques pour des tâches non scientifiques Gratuit et open source Les désavantages Pas tous les algorithmes disponibles dans les logiciels et boîtes à outils spécialisées (en constante évolution)
les briques de base Python: langage de programmation générique et moderne IPython: un interpréteur de commandes avancé Spyder: un environnement de développement à la Matlab Numpy: implantation des vecteurs et matrices Scipy: collection d algorithmes de haut niveau Matplotlib: visualisation 2 D et 3 D Mayavi: visualisation 3 D
Distributions pour les scientifiques On trouve des distributions avec programme d installation 1 clique pour les scientifiques: Pythonxy (Windows) http://code.google.com/p/pythonxy/ Enthought Python Distribution (Windows, MacOSX) http://www.enthought.com/products/epd.php Sage (Application web) http://www.sagemath.org/
Les bases de Numpy >>> a = np.array([0, 1, 2, 3]) >>> a array([0, 1, 2, 3]) >>> a.ndim 1 >>> a.shape (4,) >>> len(a) 4 >>> b = np.array([[0, 1, 2], [3, 4, 5]]) # 2 x 3 array >>> barray([[ 0, 1, 2], [ 3, 4, 5]]) >>> b.ndim 2 >>> b.shape (2, 3)
Les bases de Numpy La multiplication de matrices >>> a.dot(b) array([[ 0., 2., 3.], [ 0., 0., 3.], [ 0., 0., 0.]]) Transposée >>> a.t array([[ 0., 0., 0.], [ 1., 0., 0.], [ 1., 1., 0.]])
Les bases de Numpy Résolution d un système d équations linéaires >>> x = np.linalg.solve(a, [1, 2, 3]) >>> x array([-0.5, 0.5, 1. ]) Valeurs propres >>> np.linalg.eigvals(a) array([ 1., 2., 3.])
Scipy: la boîte à outils scipy.io : les entrées/sorties fichiers scipy.signal : les algos de traitement du signal scipy.special : fonctions spéciales scipy.stats : les algos de statistique scipy.ramdom : la gestion des nombres aléatoires scipy.linalg : l algèbre linéaire scipy.integrate : les algos d intégration numérique scipy.fftpack: la transformée de Fourier rapide scipy.interpolate: les algos d interpolation scipy.optimize: les algos d optimisation scipy.ndimage: les algos de traitement d image
Scipy: la boîte à outils import numpy as np from scipy.interpolate import interp1d import pylab as pl measured_time = np.linspace(0, 1, 10) noise = (np.random.random(10)*2-1) * 1e-1 measures = np.sin(2 * np.pi * measured_time) + noise linear_interp = interp1d(measured_time, measures) computed_time = np.linspace(0, 1, 50) linear_results = linear_interp(computed_time) cubic_interp = interp1d(measured_time, measures, kind='cubic') cubic_results = cubic_interp(computed_time)
Scipy: la boîte à outils
La visualisation avec Matplotlib pl.plot(tspan, y) pl.xlabel("time (s)", weight="bold") pl.ylabel("concentration (mol/l)", weight="bold") pl.legend(("ca", "cb")) pl.title(u"profile de concentration d'une réaction de type A -> B \ndans un réacteur batch", weight="bold")
La visualisation avec Matplotlib
La visualisation 3 D avec Matplotlib import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) x, y = np.mgrid[-10:10:100j, -10:10:100j] r = np.sqrt(x**2 + y**2) z = np.sin(r)/r ax.plot_surface(x, y, z)
La visualisation 3 D avec Matplotlib from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111, projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contour(x, Y, Z) ax.clabel(cset, fontsize=9, inline=1)
Pleins de modules additionnels OpenOpt: algorithmes d optimisation Scikit.learn: algorithmes de machine learning Sfepy, Fipy: résolution de PDEs par éléments finis SymPy: mathématiques symboliques PyDSTool: simulation de systèmes dynamiques Biopython: bioinformatique Et beaucoup d autres
Merci de votre attention! Note: cette présentation est une adaptation libre et résumée du document «Python scientific lecture notes», édité par le EuroScipy Tutorial Team et distribué sous licence Creative Common ici: http://scipy lectures.github.com/ A retenir: «Sage: une interface unifiée vers les maths open source», jeudi 12 janvier 2012,sous sol du bâtiment A