NumPy en Python : tableaux, axes et dimensions expliqués simplement

NumPy en Python : tableaux, axes et dimensions expliqués simplement

NumPy est la bibliothèque de référence pour manipuler des tableaux numériques en Python. Son objet central, ndarray, permet de travailler avec des vecteurs, matrices et tableaux multidimensionnels de façon beaucoup plus efficace et expressive qu’avec des listes classiques.

Le point le plus important à comprendre n’est pas une fonction particulière. C’est le trio shape, axes et dimensions. Une fois ces notions claires, reshape, sum, mean, concatenate, where, pad ou le broadcasting deviennent beaucoup plus faciles à utiliser.

La réponse courte

Un tableau NumPy est un bloc de données homogènes avec une forme.

import numpy as np


a = np.array([
    [1, 2, 3],
    [4, 5, 6],
])

print(a.shape)
print(a.ndim)
print(a.dtype)

Résultat :

(2, 3)
2
int64

Ici :

  • shape vaut (2, 3) : deux lignes, trois colonnes ;
  • ndim vaut 2 : le tableau a deux dimensions ;
  • dtype décrit le type des valeurs.

Pourquoi NumPy est différent d’une liste Python

Une liste Python peut contenir des objets très différents. Un tableau NumPy est conçu pour contenir des valeurs de même type, stockées de manière compacte.

Cela permet :

  • des opérations vectorisées ;
  • moins de boucles Python explicites ;
  • une meilleure performance sur les calculs numériques ;
  • une intégration avec Pandas, SciPy, scikit-learn et beaucoup d’outils data.
import numpy as np


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

print(valeurs * 10)
print(valeurs + 1)

Avec une liste Python, valeurs * 10 répéterait la liste. Avec NumPy, l’opération est appliquée élément par élément.

Comprendre shape

shape donne la taille du tableau dans chaque dimension.

import numpy as np


vecteur = np.array([1, 2, 3])
matrice = np.array([[1, 2, 3], [4, 5, 6]])
cube = np.zeros((2, 3, 4))

print(vecteur.shape)
print(matrice.shape)
print(cube.shape)

Résultat :

(3,)
(2, 3)
(2, 3, 4)

Un vecteur de forme (3,) n’est pas la même chose qu’une matrice colonne de forme (3, 1) ou qu’une matrice ligne de forme (1, 3).

Comprendre les axes

Les axes indiquent la direction dans laquelle une opération s’applique.

Pour une matrice de forme (2, 3) :

  • axis=0 parcourt les lignes et agrège par colonne ;
  • axis=1 parcourt les colonnes et agrège par ligne.
import numpy as np


a = np.array([
    [1, 2, 3],
    [4, 5, 6],
])

print(a.sum(axis=0))
print(a.sum(axis=1))

Résultat :

[5 7 9]
[ 6 15]

Cette notion est l’une des sources d’erreurs les plus fréquentes chez les débutants NumPy.

Reshape : changer la forme sans changer les données

reshape change la forme logique d’un tableau, tant que le nombre total d’éléments reste compatible.

import numpy as np


a = np.arange(12)
b = a.reshape(3, 4)

print(b)

Le tableau contient toujours douze valeurs. Elles sont simplement vues comme trois lignes et quatre colonnes.

Si le nombre d’éléments ne correspond pas, NumPy lève une erreur.

import numpy as np


a = np.arange(10)

try:
    a.reshape(3, 4)
except ValueError as erreur:
    print("forme incompatible")

Broadcasting : calculer avec des formes compatibles

Le broadcasting permet à NumPy de combiner des tableaux de formes différentes quand elles sont compatibles.

import numpy as np


a = np.array([
    [1, 2, 3],
    [4, 5, 6],
])

b = np.array([10, 20, 30])

print(a + b)

NumPy ajoute le vecteur b à chaque ligne de a.

Le broadcasting est puissant, mais il peut aussi masquer une erreur de forme. Si un résultat semble étrange, vérifiez toujours shape.

dtype : le type des valeurs

dtype influence la mémoire, la précision et certains résultats.

import numpy as np


entiers = np.array([1, 2, 3])
flottants = np.array([1.0, 2.0, 3.0])

print(entiers.dtype)
print(flottants.dtype)

Dans les calculs scientifiques, financiers ou de machine learning, le choix entre entiers, flottants 32 bits et flottants 64 bits peut compter.

Fonctions NumPy à apprendre en premier

Besoin Fonction utile
Créer une séquence np.arange, np.linspace
Changer la forme reshape
Agréger sum, mean, min, max
Filtrer where, masques booléens
Assembler concatenate, stack, hstack, vstack
Ajouter du padding np.pad
Créer des zéros ou des uns zeros, ones

Pour approfondir le padding, voir np.pad / numpy.pad en Python.

Erreurs fréquentes

La première erreur est de confondre liste de listes et tableau NumPy. Beaucoup d’opérations ne se comportent pas de la même façon.

La deuxième erreur est d’oublier axis. Si le résultat a la bonne valeur mais pas la bonne forme, regardez l’axe.

La troisième erreur est de modifier une vue en pensant modifier une copie. Certaines opérations NumPy retournent une vue sur les mêmes données.

La quatrième erreur est d’utiliser des boucles Python quand une opération vectorisée suffit.

La cinquième erreur est de créer des tableaux avec des types mélangés. NumPy doit choisir un dtype, parfois moins adapté que prévu.

Où continuer

Ce guide sert de point d’entrée au cluster NumPy.

La suite logique :

  • numpy.reshape : changer la forme d’un tableau ;
  • numpy.concatenate, stack, hstack et vstack ;
  • numpy.where et les masques booléens ;
  • numpy.linspace et arange ;
  • Pandas pour les tableaux avec colonnes nommées.

À lire aussi :

La règle à retenir : avant d’utiliser une fonction NumPy, affichez shape, ndim et dtype. Ces trois informations expliquent la plupart des comportements.

Références

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.