3. Tableaux de tableaux : matrices

Pré-requis indispensable : être à l'aise avec la notion de tableau vu au chapitre précédent, et comment créer un tableau, le modifier, s'adresser à un de ses éléments, les parcourir, ...

Dans le cas contraire : revoir le chapitre !!

Vous avez vu aux chapitres précédents la notion de tableaux, correspondant au type list de Python.

Il existe également dans de nombreux langages de programmation des tableaux à deux dimensions, c'est à dire des types construits organisés en "lignes" et en "colonnes" : chaque case située à l'intersection d'une ligne et d'une colonne correspond alors à un élément dans lequel peut être stockée une information.

Ces "lignes" et ces "colonnes" ne sont en fait qu'un moyen commode de se représenter cette organisation des données, mais ce type de données correspond en réalité à des "tableaux de tableaux", c'est à dire des tableaux dont les éléments eux-mêmes sont des tableaux ! On utilisera plutôt le terme de matrice.

Les matrices ont de nombreuses applications comme par exemple :

Structure d'une matrice

Un exemple pourrait se présenter sous cette forme :


matrice = [[0,1,2,3],
	[4,5,6,7],
	[8,9,10,11],
	[12,13,14,15]]
			

On retrouve les crochets déjà utilisés pour définir un tableau et les virgules séparant les différents éléments...

Les sauts de ligne sont là pour structurer l'affichage ci-dessus de la matrice de façon à ce qu'elle ressemble effectivement à un tableau avec des "lignes" et des "colonnes"; mais en réalité, ces sauts ne sont pas à faire figurer.
Cette matrice doit en réalité être écrite ainsi :


matrice = [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]]
				

Adressage dans une matrice

Adressage d'une "ligne" entière :

Pour adresser une "ligne" complète d'un tableau, ( donc un des "sous-tableau" ), on utilise la notation déjà vue : un élément est repéré par son index donnant sa position dans la tableau.


print(matrice[2]) # soit : afficher la ligne d'index 2

>>> [8,9,10,11]

print(matrice[0])

>>> [0,1,2,3]
					

Adressage d'une "case"

Une "case" de la tableau ( donc un élément dans une des "sous-tableau'... ) devra par contre être repérée par deux index : le numéro de la "ligne" et le numéro de la "colonne" où il est stocké.

on donne toujours le numéro de la ligne en premier selon la syntaxe suivante :


nom_de_la_matrice[ligne][colonne]
					

Exemples :


print(matrice[2][0]) # soit : afficher le premier élément de la ligne d'index 2

>>> 8

print(matrice[2][2])

>>> 10
					

Pas évident !! Il faudra bien y faire attention...

Adressage d'une "colonne"

Impossible à faire directement...Il faudra parcourir la matrice ( cf plus bas ).

Nombre d'éléments dans une matrice

Nombre de "lignes"

Il est égal aux nombres de "sous-tableaux", donc au nombre d'éléments de la matrice :


matrice = [[0,1,2],[4,5,6],[8,9,10],[12,13,14]]

lignes = len(matrice)

print(lignes)

>>> 4
			

Nombre de "colonnes"

Il est égal aux nombres d'éléments dans chaque sous-tableau; puisque toutes les "lignes" ont le même nombre de "colonnes", il suffit donc de regarder le nombre d'éléments qu'il y a, par exemple, dans le premier "sous-tableau" :


matrice = [[0,1,2],[4,5,6],[8,9,10],[12,13,14]]

colonnes = len(matrice[0])

print(matrice)

>>> 3
			

Nombre de "cases"

A votre avis ? On fait comment ??

Construction d'une matrice

A part la définition complète comme dans l'exemple ci dessus, on peut également créer une matrice par compréhension.

Vous avez déjà vu ça au chapitre sur les tableaux., mais pour une matrice, la construction nécessitera deux boucles : la première pour parcourir les "colonnes", la deuxième pour les "lignes."

Exemples :

Pour la construction précédente, l'équivalent du code serait :


matrice = [[0 for j in range(4)] for i in range(5)] # boucle j = "colonnes" / boucle i = "lignes"

print(matrice)

	>>> [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
					

Pour obtenir dans une matrice les tables de multiplication de 1 à 9 :


tableau = [[i*j for j in range(1,10)] for i in range(1,10)]

print(matrice)


>>> [[1, 2, 3, 4, 5, 6, 7, 8, 9], [2, 4, 6, 8, 10, 12, 14, 16, 18], [3, 6, 9, 12, 15, 18, 21, 24, 27], [4, 8, 12, 16, 20, 24, 28, 32, 36], [5, 10, 15, 20, 25, 30, 35, 40, 45], [6, 12, 18, 24, 30, 36, 42, 48, 54], [7, 14, 21, 28, 35, 42, 49, 56, 63], [8, 16, 24, 32, 40, 48, 56, 64, 72], [9, 18, 27, 36, 45, 54, 63, 72, 81]]
					

Méthode très puissante à condition de bien savoir ce que l'on doit écrire !

Parcours d'une matrice

Comme pour le parcours d'un tableau "simple" il y a également deux méthodes, qui utilisent toutes les deux deux boucles imbriquées :

Parcours par valeur


	tableau = [[0,1,2,3],[4,5,6,7],[8,9,10,11]]

	for ligne in tableau :  # boucle sur les "lignes"
		for element in ligne : # boucles sur les éléments de chacune des "lignes"
			print(element, end =' ')

	>>> 0 1 2 3 4 5 6 7 8 9 10 11
			

Parcours par index


	tableau = [[0,1,2,3],[4,5,6,7],[8,9,10,11]]

	lignes = len(tableau) # nombre d'éléments dans la matrice = nombre de "lignes"
	colonnes = len(tableau[0])  # nombre d'éléments dans le premier sous-tableau = nombre de "colonnes" !

	for l in range(lignes) :  # boucle sur les "lignes"
		for c in range(colonnes) : # boucles sur les "colonnes"
			print(tableau[l][c])	# affichage de l'élément à la ligne l et à la colonne c

	>>> 0 1 2 3 4 5 6 7 8 9 10 11
			

La deuxième méthode semble plus compliquée, mais c'est la seule qui permette en plus de modifier les éléments de la matrice ( c'est impossible avec la première méthode ).

QCM d'entraînement

Exercices

Construction de matrices (exercice_C08.py)

Construire, puis afficher les matrices suivantes :

  1. une matrice de 5 lignes et 10 colonnes dont chaque élément est un entier aléatoire entre 0 et 100
  2. la matrice donnée en introduction :
    
    matrice = [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]]
    			


				

Lien vers les RÉPONSES

Parcours de matrice (exercice_C09.py)

A partir de la matrice créée à la deuxième question de l'exercice 2.4.1 :

  1. afficher la matrice ligne par ligne
    
    [0, 1, 2, 3]
    [4, 5, 6, 7]
    [8, 9, 10, 11]
    [12, 13, 14, 15]
    					
  2. afficher la matrice élément par élément mais en les présentant en lignes et en colonnes
    
    0 1 2 3
    4 5 6 7
    8 9 10 11
    12 13 14 15
    					
  3. afficher la matrice colonne par colonne ( plus dur ! )
    
    0 4 8 12
    1 5 9 13
    2 6 10 14
    3 7 11 15
    					


				

Lien vers les RÉPONSES

Modification des éléments d'une matrice (exercice_C10.py)

  1. créer une matrice de 5 lignes et 5 colonnes dont chaque élément a pour valeur 0
  2. modifier la valeur de chaque élément avec un entier aléatoire entre 0 et 255


				

Lien vers les RÉPONSES

Application (exercice_C11.py)

Sur la base de l'algorithme de parcours de tableau, nous pouvons également travailler maintenant avec les matrices.

Nous allons utiliser un exemple concret de recherche dans une matrice contenant "beaucoup" de données.
Pour cela téléchargez le fichier liste-des-communes-2019.csv. Il contient la liste des communes françaises, ainsi que leur population en 2019 et leur rang dans le classement des populations, sans ex-æquo.
Le code ci-dessous permet de transférer toutes ces données dans une matrice ( un tableau de tableaux ).


import csv

liste=[]
with open("liste-des-communes-2019.csv",'r',encoding='utf-8') as f:
    lecteur=csv.reader(f,delimiter=';')
    for ligne in lecteur:
        liste.append([int(ligne[0]),ligne[1],int(ligne[2])])
				

Chaque "ligne" de la matrice correspond à une ville; les données sont classées dans cet ordre : rang, nom de commune, population.
Un affichage d'un extrait de la matrice donnera :


[11, 'Rennes', 216268]
[12, 'Reims', 183113]
[13, 'Saint-Étienne', 171924]
				

Vous avez a votre disposition une grande série de données et vous avez vu les algorithmes permettant de calculer une moyenne un maximum (ou un minimum...).
Vous devez coder un programme qui répondra aux questions suivantes :

  1. Quelle est la commune ayant le plus grand nombre d'habitants ?
  2. Quelle est la commune ayant le plus petit nombre d'habitants ?
  3. Quelle est la moyenne d'habitants par commune en France ?

Votre programme devra être structuré en fonctions.

Question :

Quelle est la complexité de la recherche d'une valeur dans une matrice ?

Lien vers les RÉPONSES