LEPL1104 : Méthodes Numériques

Tutoriel Numpy et premier devoir


Une très grande partie des exemples donnés dans ce tutoriel vient directement de https://cs231n.github.io/python-numpy-tutorial/ (sous licence MIT) :

The MIT License (MIT)

Copyright (c) 2015 Andrej Karpathy

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


0) Premier Devoir

Pour vous lancer dans le premier devoir, voici un code Python calculant l'interpolation poynomiale par la technique de la matrice de Vandermonde. Il ne s'agit donc pas de la solution du devoir :-), mais peut être une bonne source d'inspiration...

On observe que le graphe ci-dessous est exactement le même que celui obtenu à la toute fin de ce notebook avec polyval-polyfit (voir point 2).

Notez qu'on peut aussi remplir la matrice de Vandermonde en 1 seule ligne de code en utilisant les compréhensions de liste de Python (voir lignes en commentaire).

Dans la suite de ce notebook se trouve plusieurs exemples sur les fonctions utilisées dans ce petit script. Pour en citer quelques unes :

1) Arrays

La suite de ce notebook donne des exemples sur les différents outils offerts par Numpy.

En cas d'incompréhension, manque d'explications, ... ne pas hésiter à se référer à la documentation officielle de numpy (et utiliser la barre de recherche): https://numpy.org/doc/stable/reference/generated/numpy.reshape.html#numpy-reshape

N'hésitez pas non plus à recopier les exemples et les modifier pour voir ce qu'il se passe, voir quand est-ce que le code ne marche plus, ...

1.1 Création d'un Array

1.2 Array indexing

Numpy offre plusieurs façons d'indexer sur les arrays (bien plus puissant que ce qui est permis avec les listes de Python de base).

1.2.1 Slicing and Integer indexing

1.2.2 Slicing with "stepsize" :

On se rappelle que la commande $\texttt{range}$ de Python suit la synthaxe suivante :

$\texttt{range(begin, end, step)}$

Il est aussi possible de définir le pas (step) lorsqu'on effectue un "slicing" sur un numpy array :

$\texttt{a[begin:end:step]}$

Ceci est illustré sur plusieurs exemples :

1.2.3 Lists vs Arrays indexing

Utiliser la synthaxe Python des listes pour indexer sur un numpy array fonctionne aussi... Mais attention, parfois cela ne produit pas du tout le même résultat !!!

1.2.4 Integer array indexing :

Si $\texttt{a}$ est un numpy array de taille (n,m) et $\texttt{A,B}$ sont des numpy arrays d'entiers (ou des listes d'entiers) de taille $p$, alors

$\texttt{a[A,B]}$ est équivalent à $\texttt{[a[A[0],B[0]] a[A[1],B[1]] ... a[A[p-1],B[p-1]]]}$.

Exemple :

1.2.5 Boolean array indexing:

Numpy autorise aussi d'indexer sur un numpy array via un array de booléens de même taille. Cela permet de sélectionner les éléments d'un array satisfaisant une certaine condition, et ce en très peu de lignes de code :

1.3 Datatype

Pour des questions de performances ou de "robustesse", il est parfois préférable d'indiquer explicitement à Numpy quels types de données contiendra un array à son initialisation. Cela se fait via le paramètre $\texttt{dtype}$.

En particulier, si on initialise un array comme :

$\texttt{x = array([1, 2])}$,

numpy définira par défaut $\texttt{x}$ comme un array d'entiers. Cependant, si par la suite on souhaite que des éléments de $\texttt{x}$ deviennent des floats, cela peut poser quelques soucis (du type arrondis automatiques, ...)

1.4 Reshape array

Pour modifier la dimension d'un numpy array (i.e. la "shape"), on peut par exemple utiliser :

$\texttt{myarray.reshape((m, n))}$.

Cela fonctionne du moment que le nombre d'éléments de $\texttt{myarray}$ reste inchangé avant et après reshape. Dans l'exemple suivant, le array possède 6 éléments. Les seules reshape possibles sont donc : (1, 6), (6, 1), (2, 3) ou (3, 2).

Dans le cas où l'on veut convertir une matrice en vecteur (comme fait classiquement en math), on peut utiliser $\texttt{flatten}$ ou $\texttt{ravel}$. Cela revient à faire $\texttt{myarray.reshape((m*n,))}$, si $\texttt{myarray}$ est de dimension (m,n) à l'origine.

La différence entre $\texttt{flatten}$ ou $\texttt{ravel}$ est assez subtile et est expliquée en détail à l'adresse suivante : https://www.geeksforgeeks.org/differences-flatten-ravel-numpy/.

1.5 Array math

Les numpy arrays peuvent être vu comme des vecteurs et des matrices surlequels les opérations mathématiques suivantes sont autorisées :

Soit $A, B \in \mathbb{R}^{n\times m}$, deux matrices chacune représentée par un numpy array de taille (m,n) et $C \in \mathbb{R}^{m\times p}$. Soit $x \in \mathbb{R}^n$, un vecteur représenté par un numpy array de taille (n,).

D'autres fonctions utiles permettent d'effectuer diverses opérations mathématiques sur les arrays :

2) Autres fonctions utiles de numpy

En particulier, si $n = \texttt{len(X)}-1$, les coefficients calculés correspondent à ceux du polynome d'interpolation passant par les points $\texttt{(X[i], U[i])}$ (i.e. $R = 0$).

Polyval et polyfit combinés ensemble permettent de calculer en 1 seule ligne de code le polynome d'interpolation passant par les points (X_i, U_i) :