UKOnline

Objet ndarray

Dans NumPy, un tableau multidimensionnel est représenté par le type ndarray ($N$-dimensional array). On en crée une instance en précisant les dimensions désirées avec un tuple, comme le montre l'exemple suivant :

Ces instructions créent un tableau multidimensionnel à trois dimensions. La première dimension contient deux éléments, la deuxième un seul et la troisième en compte trois. Lorsque l'on crée un tableau directement avec le constructeur de ndarray, il est initialisé avec des valeurs aléatoires, comme le montre le résultat de l'exécution :

[[[-2.68156159e+154 -1.73060450e-077  2.18756344e-314]]

 [[ 2.18759226e-314  2.18760013e-314  4.17203536e-309]]]

Les dimensions sont également appelées axes dans NumPy. On peut, en effet, représenter les éléments d'un tableau multidimensionnel comme des hypercubes placé dans un repère cartésien dont les axes correspondent aux dimensions. Dans le cas d'un tableau à trois dimensions, on se retrouve avec des cubes comme l'illustre la figure 1, où on voit directement les six éléments du tableau d'exemple data.

Visualisation d'un ndarray
Les éléments d'un tableau multidimensionnel peuvent être représentés comme des hypercubes dans un espace avec autant de dimensions.

Normalement, un objet ndarray n'est jamais créé directement à partir du constructeur. Il est préférable d'utiliser des fonctions plus spécifiques, comme arange et array, déjà rencontrées dans le premier chapitre et détaillées plus loin dans ce chapitre, dans la section 2.2.

Attribut

Il est possible d'obtenir des informations sur un ndarray en récupérant les valeurs de différents attributs. Voyons quelques caractéristiques du tableau que l'on vient de créer :

Voici le résultat de l'exécution de ces quatre instructions :

<class 'numpy.ndarray'>
3
(2, 1, 3)
6

La première instruction confirme juste qu'il s'agit bien d'un objet ndarray que l'on a créé dans la variable data. Les trois suivantes fournissent des informations sur le tableau :

  • l'attribut ndim donne le nombre de dimensions (ou axes) du tableau, à savoir $3$ dans notre exemple ;
  • l'attribut shape donne les dimensions sous forme d'un tuple avec ndim éléments, à savoir $(2, 1, 3)$ dans notre exemple ;
  • et enfin, l'attribut size donne la taille du tableau, c'est-à-dire le nombre total d'éléments qu'il contient, à savoir $6$ dans notre cas.

Performance

L'une des principales différences entre les ndarray et les listes Python est le fait que ces dernières sont très flexibles pour permettre de stocker des données hétérogènes, c'est-à-dire de types différents. Une conséquence directe est la nécessité de passer par des boucles pour traiter les données des listes. Ce n'est pas forcément le cas pour les ndarray, tableaux homogènes dont tous les éléments ont le même type.

L'exemple de la figure 2 compare deux fonctions qui multiplient, respectivement, les éléments d'une liste et d'un ndarray par une constante. Pour un million d'éléments (1e6) multipliés par le nombre réel 7,3 (le programme a été exécuté sur un MacBook Pro de 2012, avec Python 3.7.1), on passe de 125,9 ms pour la liste à 1,3 ms pour le ndarray, soit pas loin de $100$ fois moins de temps ! Convaincu de la puissance des ndarray ?

Le fichier list-ndarray-comparison.py contient un programme qui compare les temps d'exécution d'opérations sur des listes Python et des ndarray.

Pour s'en sortir, la librairie NumPy utilise efficacement la mémoire de l'ordinateur. Un ndarray est toujours stocké dans des blocs consécutifs de mémoire, la taille de ces derniers dépendant du type des éléments du tableau. Sans rentrer dans les détails, cette organisation facilite l'accès aux éléments des ndarray et les opérations sur ces derniers.