Parcours de matrices - Correction
Affichages multiples
Par ligne
Un parcours par valeur des lignes de la matrice suffit :
for ligne in m:
print(ligne)
Élément par élément
Là aussi, un parcours par valeur élément par élément est possible : chaque élément d'une même ligne est affiché à la suite du précédent; à la fin d'une ligne, on fait un retour à la ligne :
for ligne in m:
for element in ligne:
print(element, end = ' ')
print() # retour à la ligne A LA FIN d'une ligne
On peut aussi faire un parcours par indice, mais c'est plus compliqué :
for i in range(len(m)): # boucle de parcours de chaque ligne
for j in range(len(m[0])): # boucle de parcours des éléments d'une ligne
print(m[i][j], end = ' ')
print()
Par colonne
Ici, un parcours par valeur ne peut pas convenir pour parcourir colonne par colonne, ça ne marche pas comme ça !
Il est donc nécessaire de faire un parcours par indice, avec la boucle "extérieure" qui parcourt les colonnes, et la boucle "intérieure" qui parcourt les éléments de cette colonne, donc ligne par ligne :
for j in range(len(m[0])): # boucle de parcours des colonnes
for i in range(len(m)): # boucle de parcours des éléments de chaque colonne ( donc ligne par ligne )
print(m[i][j], end = ' ')
print() # retour à la ligne à la fin d'une colonne
Inverser les zéros et les uns
Ici, on veut modifier les éléments de la matrice, donc pas le choix, il faut un parcours par indice :
def inverser_0_et_1(mat):
for i in range(len(m)):
for j in range(len(m[0])):
if m[i][j] == 0:
m[i][j] = 1
elif m[i][j] == 1:
m[i][j] = 0
return m
m = [[0,1,1,0],[1,0,1,0],[0,0,0,1]]
print(m) # affiche [[0,1,1,0],[1,0,1,0],[0,0,0,1]]
print(inverser_0_et_1(m)) # affiche [[1,0,0,1],[0,1,0,1],[1,1,1,0]]
Maximum/minimum d'une matrice
def maximum_matrice(m: list)->int:
maxi = m[0][0] # premier élément de la matrice
for ligne in m:
for element in ligne:
if element > maxi:
maxi = element
return maxi
def minimum_matrice(m: list)->int:
mini = m[0][0]
for ligne in m:
for element in ligne:
if element < mini:
mini = element
return mini
Produit de deux matrices
def matrices_compatibles(M1, M2):
return len(M1[0]) == len(M2)
def produit_matrices(M1, M2):
assert matrices_compatibles(M1, M2), "Les deux matrices ne peuvent pas être multipliées entre elles."
m = len(M1)
p = len(M2[0])
produit = [[0 for j in range(p)] for i in range(m)]
for i in range(m):
for j in range(p):
somme = 0
for n in range(len(M1[0])):
somme += M1[i][n]*M2[n][j]
produit[i][j] = somme
return produit
Manipulation d'images plus poussées
Le négatif
def image_negatif(mat):
copie = copy.deepcopy(mat)
for i in range(len(copie)):
for j in range(len(copie[0])) :
pixel = copie[i][j]
R = 255 - pixel[0]
V = 255 - pixel[1]
B = 255 - pixel[1]
nv_pixel = (R, V, B)
copie[i][j] = nv_pixel
return copie
Le seuil
def image_seuil(mat, seuil):
copie = copy.deepcopy(mat)
for i in range(len(copie)):
for j in range(len(copie[0])) :
pixel = copie[i][j]
R = pixel[0]
if R > seuil:
R = 255
else:
R = 0
V = pixel[1]
if V > seuil:
V = 255
else:
V = 0
B = pixel[2]
if B > seuil:
B = 255
else:
B = 0
nv_pixel = (R, V, B)
copie[i][j] = nv_pixel
return copie
Image retournée
L'idée est de parcourir la première moitié des lignes de la matrice, et d'échanger l'élément [i][j] de ces lignes avec l'élément [len(m)-i][j] :
def pivot_180(m):
copie = copy.deepcopy(m)
for i in range(len(copie)//2): # parcours de la moitié seulement des lignes !
for j in range(len(copie[0])):
copie[i][j], copie[len(m)-i][j] = copie[len(m)-i][j], copie[i][j] # méthode Python pour échanger la valeur de deux variables
return copie
Passage au noir et blanc
def noir_et_blanc(m):
copie = copy.deepcopy(m)
for i in range(len(copie)):
for j in range(len(copie[0])):
moyenne = ( copie[i][j][0] + copie[i][j][1] + copie[i][j][2] ) // 3 # copie[i][j] est un tuple !
copie[i][j] = moyenne # on remplace donc le tuple par une unique valeur entière
return copie
Applications
Ascii Art
from PIL import Image
from images import *
import codecs
def asciiArt(nomimage,tabcar,fichier):
tabimage=get_pixels(nomimage)
fichiertexte=codecs.open(fichier,"w",'utf-8')
for y in range(len(tabimage)):
for x in range(len(tabimage[0])):
fichiertexte.write(tabcar[int(tabimage[y][x][0]*10/255)]+' ')
fichiertexte.write('\n')
fichiertexte.close()
car=['@','#','S','?','%','+',':','*',';','.',' ']
asciiArt('chat.png',car,'chat.txt')
Population des communes françaises
import csv
def commune_plus_habitants(mat):
maxi = 0
nom_maxi = " "
for ligne in mat:
if ligne[2] > maxi:
maxi = ligne[2]
nom_maxi = ligne[1]
return maxi, nom_maxi
def commune_moins_habitants(mat):
mini = mat[0][2]
nom_mini = " "
for ligne in mat:
if ligne[2] < mini:
mini = ligne[2]
nom_mini = ligne[1]
return mini, nom_mini
def moyenne_population(mat):
somme = 0
for ligne in mat:
somme += ligne[2]
return somme / len(mat)
print(commune_plus_habitants(liste))
print(commune_moins_habitants(liste))
print(moyenne_population(liste))