Manipuler des tableaux#

Dans cette feuille, vous allez apprendre à effectuer quelques manipulations simples sur les tableaux, comme nous l’avions fait au premier semestre avec les vector de C++. En Python, de tels tableaux peuvent être représentés par les array de la bibliothèque NumPy (usuellement abrégée en np) :

import numpy as np

Tableaux à deux dimensions#

Voilà un tableau à deux dimensions avec deux lignes et quatre colonnes:

T = np.array([[1, 2, 3, 4], 
              [5, 6, 7, 8]])
T

On peut retrouver les tailles de ce tableau avec:

T.shape

Vous vous rappellez que les vector de C++ sont intrinsèquement des tableaux à une dimension, et que l’on émule des tableaux à deux dimensions avec des tableaux de tableaux. Ici, en revanche, les tableaux array de numpy permettent de construire explicitement des tableaux à deux dimensions.

Exercice#

  1. Construisez un tableau à trois lignes et trois colonnes, contenant les entiers de 1 à 9 de gauche à droite et de haut en bas comme dans la figure suivante:

    1 2 3
    4 5 6
    7 8 9
    
# VOTRE CODE ICI
raise NotImplementedError()
T2

Nous testons la forme du tableau:

assert T2.shape == (3,3)

ainsi que son contenu :

assert [ T2[i,j] for i in range(3) for j in range(3) ] == [1, 2, 3, 4, 5, 6, 7, 8, 9]

Voici comment accéder au contenu d’une case individuelle du tableau :

T2[1,2]

Cette case est en deuxième ligne et troisième colonne: en effet, comme en C++, les lignes et colonnes sont numérotées à partir de 0.

Si l’on veut extraire toute une ligne, ou toute une colonne, on remplace la coordonnée que l’on ne veut pas spécifier par :.

Voici donc la deuxième colonne :

T2[:,1]

Extrayez la deuxième ligne du tableau et affectez-la à la variable li dont vous afficherez le contenu :

# VOTRE CODE ICI
raise NotImplementedError()
assert isinstance(li, np.ndarray)
assert li.shape == (3,)
assert list(li) == [4,5,6]

Tableaux à trois dimensions et plus#

Pour le moment, nous avons utilisé des tableaux à deux dimensions. Ultérieurement, notamment pour représenter des images, nous aurons besoin de tableaux de plus grande dimension: un seul nombre ne suffit en effet pas pour représenter un pixel.

Numpy permet de représenter des tableaux de toute dimension. Voici un tableau de dimension 3 :

T3D = np.array([[[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9]],
                [[10,11,12], [13,14,15], [16,17,18]],
                [[19,20,21], [22,23,24], [25,26,27]]
                ])

On peut le voir comme un tableau à trois couches :

représentation du tableau à trois dimensions

Pour accéder à une case du tableau on utilise T[i,j,k], où i est le numéro de la ligne, j le numéro de la colonne et k le numéro de la couche contenant la case.

Comme pour les listes, on peut extraire des sous-tableaux avec les opérateurs de découpe de tranches (slicing).

On peut ainsi extraire ces couches comme suit :

T3D[:,:,0]
T3D[:,:,1]
T3D[:,:,2]

Exercices#

Extrayez la première colonne de la deuxième couche de T3D et stockez-la dans la variable C:

# VOTRE CODE ICI
raise NotImplementedError()
C

Notez que c’est un tableau à une dimension, donc noté en ligne !

assert list(C) == [2, 11, 20]

Maintenant, extrayez un tableau contenant la première colonne de chacune des trois couches de T3D et stockez le dans la variable C. Notez que l’on souhaite que ces colonnes soient bien représentées par des colonnes dans C !

# VOTRE CODE ICI
raise NotImplementedError()
C
for i in range(3):
    assert np.array_equal(T3D[:,0,i], C[:,i])

Statistiques simples sur les tableaux#

Numpy permet de faire des statistiques simples sur les tableaux. Revenons à notre tableau T :

T

Calculez à la main :

  • la moyenne de chaque colonne de T;

  • la moyenne de chaque ligne de T;

  • la moyenne de tous les éléments du tableau T.

Comparez vos résultats avec ceux des calculs suivants. Que calcule chaque commande ci-dessous?

T.mean(axis=0)

REPONDEZ ICI

T.mean(axis=1)

REPONDEZ ICI

T.mean()

REPONDEZ ICI

Conclusion#

Voilà, vous avez vu tous les éléments de manipulation des tableaux NumPy dont nous aurons besoin aujourd’hui.