Favicon
NSI Première

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
			

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