Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Le Machine Learning avec Python
  3. La bibliothèque NumPy
Extrait - Le Machine Learning avec Python De la théorie à la pratique
Extraits du livre
Le Machine Learning avec Python De la théorie à la pratique
10 avis
Revenir à la page d'achat du livre

La bibliothèque NumPy

Objectif du chapitre

Dans la pratique, dès lors qu’on commence à développer un programme informatique, nous nous retrouvons à manipuler des structures de données complexes. Ces structures de données sont souvent des listes, des dictionnaires, des tuples, mais aussi des vecteurs à une ou à plusieurs dimensions, telles que les matrices.  

Justement, la bibliothèque NumPy, qui est l’objet de ce chapitre, simplifie grandement, entre autres, la réalisation des opérations algébriques sur les vecteurs. 

À la fin de ce chapitre, le lecteur aura abordé :

  • la création, l’initialisation et la manipulation des tableaux NumPy à une et à plusieurs dimensions,

  • la manipulation des informations relatives aux tableaux NumPy, telles que leurs dimensions, leurs tailles et leurs types,

  • les différentes façons d’indexer un tableau NumPy afin d’accéder aux données qu’il contient,

  • la modification des données de tableaux NumPy,

  • la réalisation d’opérations algébriques sur les tableaux NumPy,

  • la restructuration de tableaux NumPy,

  • les statistiques descriptives avec les tableaux NumPy,

  • la lecture de données d’un fichier et leur stockage dans un tableau NumPy,

  • la réalisation d’opérations booléennes sur des tableaux NumPy afin de créer...

NumPy en deux mots

La bibliothèque NumPy permet de réaliser des calculs numériques de façon simple, intuitive et surtout performante sur des vecteurs à une ou à plusieurs dimensions. Les performances élevées de la bibliothèque NumPy sont dues en grande partie à la gestion efficace des tableaux de nombres. En effet, comme nous allons le découvrir tout au long de ce chapitre et particulièrement à la dernière section, NumPy gère les tableaux de nombres de manière plus concise que la manière avec laquelle Python gère les listes de nombres.  

Le succès de la bibliothèque NumPy est également dû au fait que NumPy est utilisée comme la base de développement de plusieurs autres bibliothèques célèbres, telle que la bibliothèque Pandas, que nous allons aborder lors du prochain chapitre. Également, un des points forts de la bibliothèque NumPy est qu’elle est adaptée pour stocker et traiter les données matricielles associées aux images.

Les tableaux NumPy

1. Création de tableaux NumPy

Avant de se lancer dans l’utilisation de la bibliothèque NumPy, il est nécessaire de l’installer, car elle ne fait pas partie des modules natifs de Python. Pour cela, utilisez la commande suivante dans un interpréteur de commande.

pip install numpy 

Une fois que l’exécution de la commande précédente est terminée, un message sera affiché pour vous indiquer que NumPy a bien été installée. À ce stade, vous êtes prêt pour écrire des programmes exploitant NumPy !  

a. Créer un tableau à une dimension

Pour exploiter la bibliothèque NumPy, il est nécessaire d’importer le module numpy. Traditionnellement, l’alias np est utilisé afin de référencer la bibliothèque NumPy.

Suivez les étapes ci-dessous afin de réaliser votre premier programme avec NumPy. 

 Créez un fichier avec l’extension .py et saisissez dans ce nouveau fichier le code suivant puis exécutez ce code :

import numpy as np 
 
vecteur = np.array([1,2,3,4]) 
print("vecteur = ", vecteur) 

Ce programme commence par importer la bibliothèque NumPy avec l’alias np, puis définit la variable vecteur qui correspond à un nouveau tableau NumPy créé avec la fonction numpy.array. Ce nouveau tableau contient les valeurs 1, 2, 3 et 4. La dernière instruction permet simplement d’afficher les valeurs du tableau vecteur, comme on peut le voir avec le résultat ci-après :

vecteur =  [1 2 3 4] 

Le tableau vecteur est un tableau NumPy à une dimension, c’est-à-dire qu’il est défini suivant un seul axe. La section suivante montre comment créer des tableaux NumPy à plusieurs dimensions.

b. Créer un tableau à plusieurs dimensions

Pour créer un tableau NumPy à deux dimensions, c’est-à-dire un tableau défini sur deux axes, suivez les étapes ci-après.

 Créez un fichier avec l’extension .py et saisissez dans ce nouveau fichier le code suivant, puis exécutez ce code :

import numpy as np 
 
vecteur_2d = np.array([[1,2,3,4],[5,6,7,8]]) 
print("vecteur_2d = \n", vecteur_2d) 

Ce programme...

Accéder aux données d’un tableau NumPy

1. Accès aux données d’un tableau à une dimension

Une fois qu’un tableau est créé, l’accès à ses données se fait principalement via les indices de position.

Avec Python, les indices de position commencent à la valeur 0, c’est-à-dire que le premier élément d’un tableau T, qui correspond à la première position, est situé à l’indice 0, et pour y accéder il suffit de référencer ce tableau T avec l’indice 0 entre crochets comme suit : T[0]. Cette notation est similaire à la notation utilisée avec les listes Python.

Nous pouvons utiliser la notation avec le caractère : afin d’accéder aux valeurs d’un tableau NumPy ou d’une liste Python situées avec des indices définis dans un intervalle. Cette notation s’utilise comme suit :

    [indice_début : indice_fin : pas] 

La valeur indice_début indique la première position d’un tableau à partir de laquelle nous souhaitons commencer à lire les données. La valeur indice_fin indique jusqu’à quelle position nous souhaitons lire les données. Attention, cet indice n’est pas inclus et la dernière valeur qui sera lue est la valeur située à l’indice (indice_fin - 1). La valeur pas indique le saut qui sera effectué entre indice_début et indice_fin.      

Par exemple, pour accéder à toutes les valeurs d’un tableau T situées entre la deuxième position et la quatrième position incluse, nous pouvons utiliser la notation T[1:4].

Également, si nous souhaitons accéder à toutes les valeurs d’un tableau T situées entre l’indice 2 et l’indice 10, mais en ignorant tous les indices impairs, alors nous pouvons utiliser la notation T[2:10:2].

Une autre forme d’indexation autorisée avec NumPy, mais pas avec les listes Python, est l’indexation par une liste....

Modifier les données d’un tableau NumPy

La modification des données d’un tableau NumPy est aussi simple que la lecture de ses données. En effet, pour modifier une valeur ou des valeurs d’un tableau NumPy, il suffit d’indiquer les indices des positions à modifier et la valeur à affecter à ces positions. Le programme suivant donne un exemple :

 Créez un fichier avec l’extension .py et saisissez dans ce nouveau fichier le code suivant, puis exécutez ce code :

import numpy as np 
 
vecteur = np.array([[1,2,3], 
                    [4,5,6], 
                    [7,8,9]]) 
 
vecteur[1,1] = 99  
print("Après vecteur[1,1] = 99 le tableau devient:\n",vecteur,  
      end="\n\n") 
vecteur[0,:] = 99 
print("Après vecteur[0,:] = 99 le tableau devient:\n",vecteur,  
      end="\n\n") 
vecteur[:,2] = -99 
print("Après vecteur[:,2] = -99 le tableau devient:\n",vecteur,  
      end="\n\n") 

Ce programme crée le tableau vecteur à deux dimensions puis réalise les trois affectations suivantes :

  • Affectation de la valeur 99 à la position située à...

Copier un tableau NumPy dans un autre tableau NumPy

Un point important à prendre en compte lorsque nous manipulons les tableaux, et de façon générale lorsque nous manipulons des objets, est que lorsque nous affectons un tableau T1 à un autre tableau T2, le résultat de cette affectation n’est pas la copie des valeurs stockées dans T1 dans le tableau T2, mais seulement la copie de l’adresse où est stocké T1 dans la variable T2 ! En d’autres termes, après l’affectation de T1 à T2, les deux tableaux pointent vers les mêmes adresses mémoire et la modification de l’un des deux tableaux affecte l’état de l’autre tableau. L’exemple de programme suivant montre ce qui se passe réellement lors de l’affectation d’un tableau dans un autre.

 Créez un fichier avec l’extension .py et saisissez dans ce nouveau fichier le code suivant, puis exécutez ce code :

import numpy as np 
 
vecteur_1 = np.array([1,2,3]) 
vecteur_2 = vecteur_1  
vecteur_2[2] = 99  
print("vecteur_1 =", vecteur_1) 
print("vecteur_2 =", vecteur_2) 

Ce programme crée tout simplement un tableau vecteur_1 puis affecte ce même tableau au deuxième tableau vecteur_2. Puis la valeur 99 est affectée à la troisième position de vecteur_2. Les deux...

Algèbre linéaire avec NumPy

1. Opérations mathématiques de base avec NumPy

NumPy est intéressant à utiliser dès que nous manipulons des tableaux numériques, car comme nous allons le voir à l’avant-dernière section de ce chapitre, l’utilisation de ces tableaux permet d’avoir des programmes plus performants en matière de rapidité d’exécution.

Un autre avantage de NumPy est que les opérations algébriques sur les espaces vectoriels peuvent être facilement exprimées. Avec les tableaux NumPy, notamment les tableaux à deux dimensions, les opérations classiques telles que la multiplication ou l’inversion de matrices deviennent très faciles à programmer. 

L’exemple de programme suivant montre comment réaliser tout simplement les opérations mathématiques de base avec des tableaux à une dimension. Ces mêmes opérations peuvent être appliquées sur des tableaux à plusieurs dimensions. 

 Créez un fichier avec l’extension .py et saisissez dans ce nouveau fichier le code suivant, puis exécutez ce code :

import numpy as np 
 
vecteur_1 = np.array([1,2,3,4,5]) 
print("vecteur_1 = ",vecteur_1) 
print("vecteur_1 + 2 = ",vecteur_1+2) 
print("vecteur_1 - 2 = ",vecteur_1-2) ...

Réorganiser des tableaux NumPy

La réorganisation d’un tableau consiste en la modification de la structure de ce tableau. Cette modification de structure peut intervenir à plusieurs niveaux. Par exemple, un tableau à une dimension qui contient huit valeurs numériques peut être transformé en un tableau à deux dimensions qui représente une matrice avec quatre lignes et deux colonnes, ou encore transformé en un tableau à trois dimensions avec deux matrices réparties sur le premier axe, qui auront chacune deux lignes et deux colonnes. La réorganisation de tableaux peut également résulter de la concaténation verticale ou horizontale de plusieurs tableaux.

1. Restructurer un tableau NumPy

L’exemple du programme suivant montre comment partir d’un tableau à deux dimensions pour construire deux autres tableaux. Le premier tableau sera également défini sur deux axes, mais le second nouveau tableau sera défini sur trois axes.  

 Créez un fichier avec l’extension .py et saisissez dans ce nouveau fichier le code suivant, puis exécutez ce code :

import numpy as np 
 
mat_1 = np.array([[1,2,3,4],[5,6,7,8]]) 
mat_2 = mat_1.reshape(4,2) 
mat_3 = mat_1.reshape(2,2,2) 
print("mat_1:\n", mat_1) 
print("mat_2:\n", mat_2) 
print("mat_3:\n"...

Statistiques descriptives avec NumPy

Le sixième chapitre est entièrement dédié aux statistiques, mais en attendant, cette section montre comment réaliser les statistiques descriptives élémentaires sur les données d’un tableau NumPy. Considérons le programme à suivre.

 Créez un fichier avec l’extension .py et saisissez dans ce nouveau fichier le code suivant, puis exécutez ce code :

import numpy as np 
 
mat_1 = np.random.randint(-10,10, size=(5,5)) 
print("mat_1 :\n", mat_1)  
 
min_value = np.min(mat_1) 
print(f"\nLa valeur minimale de toute la matrice est: 
{min_value}\n") 
max_value = np.max(mat_1) 
print(f"La valeur maximale de toute la matrice est: 
{max_value}\n") 
 
min_value_by_col = np.min(mat_1, axis=0) 
print(f"Les valeurs minimales par colonne sont: 
{min_value_by_col}\n") 
min_value_by_row = np.min(mat_1, axis=1) 
print(f"Les valeurs minimales par ligne sont: 
{min_value_by_row}\n") 
 
mean_value_by_col = np.mean(mat_1, axis=0) 
print(f"Les moyennes par colonne sont: {mean_value_by_col}\n") 
std_by_col = np.std(mat_1, axis=0) 
print(f"Les écarts-types par colonne sont: {std_by_col}\n") 
sum_by_row = np.sum(mat_1, axis=1) 
print(f"Les...

Lire des données NumPy à partir d’un fichier

Lire les données numériques stockées dans un fichier est très simple et pratique avec NumPy. Le programme suivant montre comment lire les données stockées dans un fichier np_data.txt.

 Créez un fichier avec l’extension .py et saisissez dans ce nouveau fichier le code suivant, puis exécutez ce code :

import numpy as np 
 
my_data = np.genfromtxt("../Data/np_data.txt", delimiter =',') 
my_data =  my_data.astype('int32') 
print(my_data) 

Ce programme lit dans le tableau my_data les données du fichier np_data.txt avec la fonction numpy.genfromtxt en lui indiquant le chemin vers ce fichier et le caractère délimiteur des différentes valeurs dans ce fichier ; ici, c’est le caractère ’,’. Le fichier np_data.txt se trouve dans le dossier Data de ce chapitre. Le programme affiche les données du tableau my_data, puis transforme le type de ces données avec la fonction astype. En effet, le type par défaut des données est le type float, et à l’aide de la fonction astype nous pouvons indiquer le type souhaité pour ces données, ici le type int32. L’exécution de ce programme affiche les résultats suivants :

my_data: [[  2.   5.  36....

Les masques booléens avec NumPy

1. Créer et utiliser un masque booléen

Souvent, lorsque nous manipulons des tableaux NumPy, nous avons besoin d’accéder à leurs valeurs suivant certaines conditions.

Le programme suivant montre comment accéder aux valeurs d’un tableau NumPy suivant des conditions fixées au préalable.

 Créez un fichier avec l’extension .py et saisissez dans ce nouveau fichier le code suivant, puis exécutez ce code.

import numpy as np 
 
my_data = np.genfromtxt("../Data/np_data.txt", delimiter =',') 
my_data =  my_data.astype('int32') 
print("my_data :\n",my_data)  
 
bool_data = my_data > 100 
print("\nLes indices booléens pour les valeurs > 100 :\n 
",bool_data) 
 
gt_100 = my_data[bool_data] 
print("\nLes valeurs > 100 :\n",gt_100) 

Ce programme lit les données stockées dans le fichier np_data.txt dans le tableau my_data. Puis il stocke dans un deuxième tableau bool_data, de la même taille que le tableau my_data, des valeurs booléennes en fonction du résultat de la comparaison avec la valeur 100 des valeurs du tableau my_data. Si la valeur du tableau my_data à une position donnée est supérieure à 100, alors à cette même position du tableau bool_data sera stockée la valeur True, sinon c’est la valeur False qui sera affectée à cette position du tableau bool_data. Également, ce programme crée un troisième tableau gt_100 dans lequel seront récupérées les valeurs de my_data suivant le masque défini avec les valeurs booléennes...

Tableaux NumPy versus listes Python

Nous avons vu qu’avec la bibliothèque NumPy les opérations sur les vecteurs à plusieurs dimensions sont réalisées de manière simple et intuitive. En plus de cet avantage, les tableaux NumPy présentent un autre avantage sur les listes natives Python : celui d’être plus performants en termes du temps d’utilisation du processeur.

Les tableaux NumPy sont plus rapides à l’exécution que les listes Python pour les deux raisons suivantes :

1.

La restriction sur les types de données : une liste Python permet de stocker des objets hétérogènes. Par exemple, une même liste Python peut contenir simultanément des chaînes de caractères, des nombres entiers et des nombres flottants. Avec les tableaux NumPy, ceci n’est pas possible. En effet, un tableau NumPy contient des données homogènes.

Le fait que les données d’un tableau NumPy sont toutes de même type permet de les parcourir de manière optimisée.

Soit la liste Python [10, ’Hello’, 3.14]. Pour parcourir et lire tous les éléments de cette liste, Python doit d’abord réaliser un contrôle sur le type du premier élément afin de savoir sa taille en mémoire ; ici, c’est un entier. Puis lorsque Python accède au deuxième élément, il doit également d’abord contrôler le type de cet élément afin de savoir que c’est un objet de type chaîne de caractères et le lire correctement. Enfin, Python doit encore réaliser un contrôle sur le type du troisième élément pour comprendre que ce dernier élément est un nombre flottant et le lire en tant que tel. Avec NumPy, les données sont toutes de même type et donc tous ces contrôles ne sont plus nécessaires.

2.

L’organisation des données en mémoire : les éléments d’une liste Python sont stockés de manière éparse dans la mémoire, c’est-à-dire que les objets d’une même liste sont éparpillés un peu partout dans la mémoire vive. Pour retrouver tous les éléments d’une liste...

Conclusion

Ce chapitre nous a permis de découvrir NumPy à travers un petit tour d’horizon des fonctions que cette bibliothèque propose. Nous avons essayé d’insister sur le fait que cette bibliothèque facilite grandement la manipulation des tableaux et les opérations qui leur sont associées. Nous avons également montré l’avantage en matière de temps CPU qu’on peut tirer via l’utilisation de cette bibliothèque. Le chapitre suivant va nous permettre de découvrir la bibliothèque Pandas, conçue sur la base de la bibliothèque NumPy et qui nous propose des fonctionnalités intéressantes pour la manipulation des jeux de données sous forme de DataFrame. Ce format de données en DataFrame est incontournable dans le domaine de la Data Science !