Connexion élèves

Choisir le(s) module(s) à installer :

Matrices ( tableaux de tableaux ) - Correction

Construction de matrices par compréhension

Matrice mat1


mat1 = [[0 for j in range(10)] for i in range(5)]
			

Matrice mat2


from random import randint

mat2 = [[randint(1, 9) for j in range(7)] for i in range(7)]
			

Matrice mat3

Il fallait bien voir que le chiffre unique que l'on plaçait à chaque ligne était le numéro de la ligne :


mat3 = [[i for j in range(10)] for i in range(7)]
			

Matrice mat4

Ici, c'est le numéro de colonne que l'on affiche sur chacune des lignes :


mat4 = [[j for j in range(10)] for i in range(7)]
			

Matrice mat5

Moins évident...il fallait avoir l'idée que l'on place 0 sur les lignes paires ( indices 0, 2, 4, ...) et 1 sur les lignes impaires ( indices 1, 3, ...); c'est donc la valeur du reste de la divisions du numéro de ligne par 2 que l'on place sur chacune des lignes :


mat5 = [[i%2 for j in range(7)] for i in range(6)]
			

Matrice mat6

Et encore moins évident...il fallait trouver que le nombre affiché est une combinaison de i et j :


mat6 = [[4*i + j for j in range(4)] for i in range(4)]
			

Mutation/copie de matrices


import copy

def viser_coins(mat: list[list])->list[list]:
    """Matrice de 6 lignes et 5 colonnes"""

    mat[0][0] = 'x'
    mat[0][4] = 'x'
    mat[5][0] = 'x'
    mat[5][5] = 'x'
					
def viser_les_coins(mat: list[list])->list[list]:
    """Matrice de taille quelconque"""

    nb_l = len(mat)                     #<--- nombre de lignes
    nb_c = len(mat[0])                  #<--- nombre de colonnes

    mat[0][0] = 'x'
    mat[0][nb_c-1] = 'x'
    mat[nb_l-1][0] = 'x'
    mat[nb_l-1][nb_c-1] = 'x'					
					
def viser_les_coins_copie(mat: list[list])->list[list]:
    """Copie de matrice de taille quelconque"""

    copie = copy.deepcopy(mat)

    nb_l = len(copie)                  
    nb_c = len(copie[0])                 
	
	copie[0][0] = 'x'
	copie[0][nb_c-1] = 'x'
	copie[nb_l-1][0] = 'x'
	copie[nb_l-1][nb_c-1] = 'x'
	
	return copie	
			

Images matricielles

Image noire/grise

			
def noir(hauteur: int, largeur: int)->list:

	m = [[0 for j in range(largeur)] for i in range(hauteur)]  # largeur = colonnes / hauteur = lignes
	
	return m
			
			
def grise(hauteur: int, largeur: int, niveau: int)->list:

	if niveau > 255 or niveau < 0 : # tests si le niveau de gris est hors limites
		niveau = 255    # dans ce cas, on crée une image blanche !
		
	m = [[niveau for j in range(largeur)] for i in range(hauteur)] 
		
	return m
			

Image aléatoire

	
from random import randint

def aleatoire(hauteur: int, largeur: int)->list:

	m = [[randint(0, 255) for j in range(largeur)] for i in range(hauteur)]  
	
	return m			
			

Quadrillage

Pour les lignes verticales, il faut donc mettre un pixel à 0 ( = noir ) tous les 20 pixels ( on veut 10 lignes ), et 255 ( = blanc ) pour tous les autres.

On va donc tester quand l'indice de parcours de ligne j est un multiple de 20 ( reste de la division de j par 20 égal à 0 : j%20 == 0 ) : dans ce cas, on met un pixel noir ( 0 ), sinon on met un pixel blanc :

			
def lignes_verticales()->list:

	m = [[255 if j%20 != 0 else 0 for j in range(200)] for i in range(200)] 
	
	return m
			

Et par analogie, pour les lignes horizontales, le calcul doit se faire bien entendu sur l'indice de ligne :

			
def lignes_horizontales()->list:

	m = [[255 if i%20 != 0 else 0 for j in range(200)] for i in range(200)] 
	
	return m
			

Dégradé de gris

Il faut donc trouver une formule de calcul qui fasse varier le niveau de gris selon l'indice de la colonne :

Il suffit donc de donner au niveau la valeur de l'indice de la colonne :

			
def degrade_horizontal()->list:

	m = [[j for j in range(256)] for i in range(256)] 
	
	return m
			

Et bien entendu, pour un dégradé vertical :

			
def degrade_vertical()->list:

	m = [[i for j in range(256)] for i in range(256)] 
	
	return m
			

Image colorée aléatoire

			
from random import randint

def couleur_aleatoire(largeur: int, hauteur: int)->list:

	m = [[(randint(0,255),randint(0,255),randint(0,255)) for i in range(largeur)] for j in range(hauteur)]

	return m
			

Dégradé coloré

Il faut faire varier les valeurs de R, V et B dans le tuple en fonction de l'indice de colonne ou de ligne; par exemple :

		
def degrade_colore_horizontal()->list:

	m = [[(j, 155, j) for j in range(256)] for i in range(256)] 
	
	return m
			
			
def degrade_colore_ vertical()->list:

	m = [[(100, i, i) for j in range(256)] for i in range(256)] 
	
	return m
			

Mais plein d'autres possibilités sont possibles !!

Drapeaux

Plus dur ! Il faut utiliser la même astuce que pour les lignes verticales et horizontales.

Par exemple, pour le drapeau français, en lui donnant une largeur de 256 pixels:

On en déduit que :

			
def drapeau_français()->list:
    b = (0,0,255)     # bleu
    w = (255,255,255) # blanc
    r = (255,0,0)     # rouge
    m = [[b if j<85 else w if j>85 and j<171 else r for j in range(256)] for i in range(200)] 
    return m
			

Et pour le drapeau italien :

			
def drapeau_français()->list:
    b = (0,255,0)     # vert
    w = (255,255,255) # blanc
    r = (255,0,0)     # rouge
    m = [[b if j<85 else w if j>85 and j<171 else r for j in range(256)] for i in range(200)] 
    return m