3. Numpy : manipuler des tableaux de nombres.#

Les listes classiques ont plusieurs limites quand on veut faire du calcul numérique. En effet, les opérations sur les listes classiques éléments par éléments (ajouter le même nombre à tous les éléments d’une liste, sommer deux à deux les éléments de deux listes…) nécessite de créer systématiquement des boucles.

C’est pourquoi on utilisera le module numpy qui propose un objet particulier : le tableau numpy (ou vecteur numpy quand il n’a qu’une dimension). Les opérations sur un tableau numpy sont différentes des opérations sur une liste classiques, il est important de différencier les deux pour ne pas se tromper.

3.1. Importer la bibliothèque#

import numpy as np

Question

Pour utiliser la fonction array de la bibliothèque numpy. On utilise alors array(...) ou np.array(...) ?

Cliquez pour avoir la réponse.

On a importé numpy dans un espace nommé np, on utilisera donc la syntaxe np.array(...).

3.2. Créer un vecteur numpy#

A partir d’une liste d’entiers ou de flottants (uniquement) :

L = [1, 6, 2, 5, 3.4]  # Ne mettre QUE des nombres
V1 = np.array(L)  # V1 est un vecteur numpy

"""ou directement"""
V1 = np.array([1, 6, 2, 5, 3.4])  #

A connaître : arange(start, stop, step) est une fonction de numpy qui va créer une liste de flottants partant de start (inclus) et allant jusqu’à stop (exclus) par pas de valeur step.

start, stop et step peuvent être des flottants contrairement à range.

y = np.arange(2, 6, 0.5)

y est un vecteur numpy contenant array([2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5])

A connaître : linspace(start, stop, N) est une fonction de numpy qui crée un vecteur de N éléments réparties uniformément entre les valeurs start et stop (cette fois stop est inclus, il faut la compter dans les N valeurs !).

y = np.linspace(2, 6, 9)

y est un vecteur numpy contenant array([2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. ])

A connaître : zeros(N) est une fonction de numpy qui crée un vecteur de N éléments nuls.
A connaître : ones(N) est une fonction de numpy qui crée un vecteur de N éléments tous égaux à 1.

y = np.zeros(5)  # Crée un vecteur [0, 0, 0, 0, 0]
y = np.ones(5)  # Crée un vecteur [1, 1, 1, 1, 1]

Plusieurs fonctions de la bibliothèque numpy renvoient un vecteur numpy.

""" Exemple : La fonction suivante evalue le polynome 
p(x) = 2x + 3 (éléments du premièr argument [2, 3])
pour les valeurs de la liste [1, 4, 6, 7, 8, 24] (deuxième argument)
"""
y = np.polyval([2, 3], [1, 4, 6, 7, 8, 24])

y est un vecteur numpy contenant array([ 5, 11, 15, 17, 19, 51])

3.3. Opérations sur les vecteurs numpy#

3.3.1. Opérations générales#

numpy permet de faire des opérations classiques : +, -, /, *

  • termes à termes entre deux vecteurs (Il faut que les deux vecteurs aient la même taille)

  • appliqué à chaque élément d’un vecteur entre un vecteur et une valeur seule (un scalaire) (cf. exemple ci-dessous)

Attention

L’opérateur + na pas la même fonction que pour des listes classiques.

"""Essayer de prévoir ce que va afficher chaque print puis afficher le résultat (croix à droite en bas)"""

V1 = np.array([1, 2, 3, 4])
V2 = np.array([2, 3, 4, 5])

print(V1 + V2)
print(V1 * V2)
print(V1 - V2)
print(V1 / V2)

V3 = np.ones(5) * 4  # Méthode très utile
print(V3)
[3 5 7 9]
[ 2  6 12 20]
[-1 -1 -1 -1]
[0.5        0.66666667 0.75       0.8       ]
[4. 4. 4. 4. 4.]

3.3.2. Fonctions mathématiques usuelles.#

numpy permet de vectorialiser les fonctions usuelles (sin, cos, tan, exp, log…), c’est-à-dire de les appliquer sur chaque élément d’un vecteur numpy.

Attention

Attention : ces fonctions sont dans la bibliothèque numpy, pas la bibliothèque math. Si numpy est importé dans un espace nommé (np par exemple), il faut utiliser : np.sin, np.cos, np.tan, np.exp, np.log,...

"""Essayer de prévoir ce que va afficher chaque print puis afficher le résultat (croix à droite en bas)
np.pi est une variable de la bibliothèque numpy égale à pi
"""

V1 = np.array([0, np.pi / 6, np.pi / 3, np.pi / 2, np.pi])
V2 = np.linspace(0, 1, 5)  

print(V2)
print(np.sin(V1))
print(np.cos(V1))
print(np.tan(V1))
print(np.exp(V2))
print(np.log(V2))  # on écrit log mais il s'agit de la fonction ln classique.
[0.   0.25 0.5  0.75 1.  ]
[0.00000000e+00 5.00000000e-01 8.66025404e-01 1.00000000e+00
 1.22464680e-16]
[ 1.00000000e+00  8.66025404e-01  5.00000000e-01  6.12323400e-17
 -1.00000000e+00]
[ 0.00000000e+00  5.77350269e-01  1.73205081e+00  1.63312394e+16
 -1.22464680e-16]
[1.         1.28402542 1.64872127 2.11700002 2.71828183]
[       -inf -1.38629436 -0.69314718 -0.28768207  0.        ]
C:\Users\cedri\AppData\Local\Temp\ipykernel_2228\3843544815.py:13: RuntimeWarning: divide by zero encountered in log
  print(np.log(V2))  # on écrit log mais il s'agit de la fonction ln classique.

3.3.3. Concaténation, ajout d’une valeur#

Attention

Les vecteurs numpy sont de taille fixe. On ne peut pas changer leur taille avec la méthode classique append.

Il existe par contre une fonction dans le module numpy qui s’appelle append (il faut suivre…) qu’on appellera donc ici np.append (cf. l’importation). Cette fonction ne modifie pas le vecteur initial mais crée un nouveau vecteur qu’il va falloir enregistrer dans une variable.

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

V2 = np.append(V1, 4)  # On ajoute la valeur 4
print(V1)  # V1 est toujours array([1, 2, 3])
print(V2)  # V2 est array([1, 2, 3, 4])

V3 = np.append(V1, V2)  # On peut aussi concatener deux vecteurs numpy.
print(V3)
[1 2 3]
[1 2 3 4]
[1 2 3 1 2 3 4]

3.3.4. Sélection d’une partie d’un vecteur numpy#

Le principe est le même que pour la sélection d’une partie d’une liste. Si on sélectionne un seul élément, ce sera un entier ou un flottant. Si on sélectionne plusieurs éléments, ce sera un vecteur numpy.

3.4. Créer un tableau numpy#

On peut créer un tableau numpy à 2 dimensions. C’est très utile pour traiter des données expérimentales.

On utilise à nouveau array. Attention : Le tableau doit être rectangulaire (ou carré) : les lignes doivent avoir toutes le même nombre d’éléments.

L = [[2.3, 2.5], [3.14, 3.16]]  # Ne mettre QUE des nombres
V1 = np.array(L)  # V1 est un tableau numpy

"""ou directement"""
V1 = np.array([[2.3, 2.5], [3.14, 3.16]])  # Note : on entre le tableau ligne par ligne

A connaître : zeros((N, m)) est une fonction de numpy qui crée un tableau de N éléments par m éléments nuls. A connaître : ones((N, m)) est une fonction de numpy qui crée un tableau de N éléments par m éléments tous égaux à 1.

y = np.zeros((5, 3))  # Crée un tableau de 0 contenant 5 lignes et 3 colonnes
y2 = np.ones((5, 3))  # Crée un tableau de 1 contenant 5 lignes et 3 colonnes

3.5. Manipuler un tableau numpy.#

La manipulation des tableaux numpy est plus délicate que les vecteurs. Une présentation est proposée pour ceux qui se sentent à l’aise avec le concept de vecteurs.

On pourra déjà retenir que les opérations terme à terme sont réalisable aussi avec deux tableaux de même taille.

3.6. Fonctions de la bibliothèque#

numpy embarque de nombreuses fonctions très utiles qui seront présentées durant l’année. Vous apprendrez ainsi la syntaxe associée à ces fonctions au fur et à mesure. Citons à titre d’exemple :

  • polyfit : Permet l’ajustement d’un modèle (linéaire en général)

  • Sous-module random : contient plusieurs fonctions permettant des tirages aléatoires (uniform, normal) : utile pour les simulations de Monte-Carlo en physique-chimie.