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
.
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 avecndim
é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
?
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.