III. Python pour la science : outils et librairies 1. IPython • L'interpréteur Python de base est un peu limité pas de cd, ls, rappels de lignes, etc." • IPython : un interpréteur Python amélioré" ! complète les commandes, fichiers/dossiers avec Tab" ! aide intégrée : help plot! ! affichage numérique et graphique interactif (cf la suite)" ! raccourcis à la Matlab : cd, ls, pwd, !mkdir, who" ! ça serait dommage de ne pas s'en servir" ! v1.0 cette année ! (notebooks etc)" ! http://ipython.org" • Astuce : ^d pour quitter" 2. Modules (1) • les fonctions supplémentaires de python proviennent de modules! • module = script python normal avec fonctions, variables, objets, etc." • nom du module = nom du fichier" • Exemple : " "# fonction “paf” du module “toto.py”" "import toto" "toto.paf()" 2. Modules (2) • En créant ses propres modules, on peut ensuite les importer" # mon_module.py def a_plus_b (a, b): mon_module.py return a+b 2. Modules (3) • plusieurs variantes de l'importation" Commande" Appel de fonction" import mon_module " mon_module.a_plus_b()" import mon_module as mon! mon.a_plus_b()" from mon_module import a_plus_b" a_plus_b()" from mon_module import *" (à éviter)" a_plus_b()" 2. Modules (4) • un module peut contenir d'autres modules" • Exemple:" "import scipy.stats "scipy.stats.nanmean()" • d'où l'intéret de import ... as ...! !import scipy.stats as st "st.nanmean()" 2. Modules (5) : modules standard • manipulation de chaines, transferts réseaux, serveurs web, lecture/écriture, analyses variées" • os: Module pour manipuler des répertoires et fichiers, utile pour une utilisation "script shell”" o os.path - manipulation des chemins d'accès" o os.shutil, filecmp - manipulation des fichiers " " Exemple:" import os" print os.path.basename() " 3. Modules Scientifiques Deux modules importants numpy matplotlib • • Et quelques autres scipy netCDF4 Basemap • • • 3.1 numpy Python standard : • Ne fait pas les opérations sur les éléments de la liste • Listes limitées à 1 dimension • Calculs par boucles, lents • Peu adapté au travail scientifique 3.1 numpy • depuis 1995, suite de Numeric/numarray, aujourd’hui à v.1.7" • type "tableau de type fixe" à n dimensions" o x = array([0, 1, 2, 3])" o ou x = r_[0, 1, 2, 3], x = r_[0:4]" o optimisé pour manipulations numériques" o très rapide " • scipy, matplotlib, netCDF, HDF... parlent numpy" 3.1 numpy • Interactif : ipython –pylab importe tout numpy" " " " " " " • Dans les scripts : import numpy as np! 3.1 numpy On indexe numpy comme une liste à n dimensions. " • x = r_[0:2:0.01] • x[0], x[50:], x[:-10] • x[:,:,:,3] • x[x < 3] = 0 • x=x.T # transpose • x=a*b 3.1 numpy : manipulation de tableaux np.zeros([d1,d2,...]) np.ones([d1,d2,...]) tableaux de 0 ou 1 de dimensions d1,d2... a1.shape a1.reshape([...]) Dimensions du tableau a1 redimensionne le tableau a1 np.concatenate( [a1,a2,...],axis=n) Concatène des tableaux le long de la dimension n np.mean(a1), np.std(a1) moyenne, écart-type, min et max du tableau a1 np.min(a1), np.max(a1) axis=n travaille le long de la dimension n np.sin(), np.cos(), np.tan(), np.transpose(), np.flipud(), np.tile()... 3.1 numpy sait faire autre chose • Lecture/écriture simples o np.loadtxt(), np.savetxt() : ASCII o np.load(), np.save(): format numpy pour fichiers temporaires • Interpolation o np.interp() • Histogrammes à 1, 2, n dimensions o np.histogram(), np.histogram2d(), np.histogramdd() • Masked arrays o np.ma 3.2 Matplotlib • Beaucoup de modules Python pour faire des plots" o PyNGL, Chaco, Veusz, gnuplot, Rpy, Pychart..." • Matplotlib émerge comme un "standard"" o "all-purpose" plot package, interactif ou publication-ready" ! EPS, PNG, TIFF" o forte interaction avec numpy, scipy" o extensible, populaire, stable" o "Matplotlib tries to make easy things easy and hard things possible" " o utilisation "matlab-like" ou orientée objet" 3.2 Matplotlib et Matlab • matplotlib.pyplot : commandes proche de Matlab o plot, semilogx, semilogy, pcolor (shading flat), xlabel, ylabel, title, legend, hist, figure, axis, subplot, contour, colorbar, quiver, axes, xlim, ylim, xticks, yticks... • interactif : ipython –pylab importe pyplot • scripts : import matplotlib.pyplot as plt 3.2 Matplotlib : exemples (1) • Séries Temporelles simples" plt.plot(time, y) Python et matplotlib comprennent les dates Matplotlib comprend Latex plt.plot(x, y) xlabel('time (s)') 3.2 Matplotlib : exemples (2) • Séries temporelles de profils verticaux de vent" 3.2 Matplotlib : exemples (3) • Contours avec labels" 3.2 Matplotlib : exemples (4) • Histogrammes" plt.hist() 3.2 Matplotlib : exemples (5) • time-range plot (pcolor en matlab) avec colorbar" plt.pcolor(time, z, pr2) plt.colorbar() 3.2 Matplotlib : exemples • 3D plots (mplot3d Toolkit)" 3.2 Matplotlib : etc. • http://matplotlib.sourceforge.net/gallery.html 3.2 Matplotlib : Basemap • from mpl_toolkits import • projections : (x, y) <-> (lon, lat) o plots o cartes o contours o cotes, frontières, géodésie basemap 3.2 Matplotlib+Basemap : exemple (1) 3.2 Matplotlib + Basemap : exemple (2) 3.3 scipy • fonctions mathématiques spécialisées • regroupées par thèmes dans des sous-modules o ndimage - multi-dimensional image processing o stats - statistiques o io - lecture/écriture (netCDF3, ASCII, Matlab) o signal - signal processing o interpolate - interpolations n-dimensions linéaires, cubiques, quadratiques, splines et autres o linsolve, odeint - linear equation / ordinary differential equations solvers o fftpack - transformees de Fourier o integrate... • Impossible de tout couvrir, Google is your friend 3.4 netcdf4-python • netCDF 3 ou 4" • PyNIO, scipy.io, pycdf... marchent aussi" • Variables netCDF comme des variables Python" import netCDF4 nc = netCDF4.Dataset('test.nc') lon = nc.variables[‘longitude’] print lon.units Print lon[:], nc.variables[‘latitude’][:] All together now #!/usr/bin/env python import numpy as np import matplotlib.pyplot as plt import netCDF4 from mpl_toolkits.basemap import Basemap nc = netCDF4.Dataset('geo_em.d01.nc') lat = nc.variables['XLAT_M'][0,:,:] lon = nc.variables['XLONG_M'][0,:,:] hgt = nc.variables['HGT_M'][0,:,:] m = Basemap(projection='lcc',lat_0=-70,lon_0=-60, width=3000*1000,height=3000*1000) x, y = m(lon, lat) m.pcolor(x, y, hgt) m.drawmapboundary() m.drawmeridians(color='grey') m.drawparallels(color='grey') m.drawcoastlines(color='grey') plt.colorbar().set_label('Elevation [m]') plt.savefig('example_basemap.png') 18 lignes de Python" pour rire : essayer de faire la même chose en Fortran" Autres modules • pyhdf - lecture/écriture HDF4 • pyh5, PyTables - lecture/écriture HDF5 • PyNIO - lecture/écriture GRIB1 et 2, HDFEOS • PyWavelets - transformées en ondelettes • shapely - géométrie planaire • GIS-Python - geographic information systems • SymPy - calcul symbolique à la Mathematica/Maple • PyClimate - analyses de series climatiques • ...