Académique Documents
Professionnel Documents
Culture Documents
print(min(liste)) # minimum
print(max(liste)) # maximum
print(len(liste)) # longueur
print(sum(liste)) # somme des éléments
liste = [False, False, True]
On peut également convertir des listes en Tuples, ou des tableaux Numpy (que l'on verra par la suite) en
liste...
tuple_1 = (1, 2, 3, 4)
liste_1 = list(tuple_1) # convertir un Tuple en liste
print(type(liste_1))
age = int(age)
print(type(age))
#autre méthode
message = f'il fait {x} degrées a {ville}'
print(message)
Cette fonction est très pratique parce qu‘elle peut par exemple permettre a des développeurs d’accéder à
certaines clefs de leurs dictionnaires contenant les paramètres de leurs réseaux de neurones.
import numpy as np
parametres = {"W1" : np.random.randn(2, 4),
"b1" : np.zeros((2, 1)),
"W2" : np.random.randn(2, 2),
"b2" : np.zeros((2, 1)),}
For i in range(1, 3):
print("couche", i)
print(parametres["W{}".format(i)])
#print(parametres["W"+str(i)])#autre méthode
Dans la pratique, on écrit plus souvent with open() as f pour ne pas avoir a fermer le fichier une fois le
travail effectué :
With open('text.txt', 'r') as f:
print(f.read())
Pour écrire plusieurs données dans un fichier avec cette méthode pose des problèmes de même que le fait
d’écrire les entiers. Pour résoudre le problème on peut donc utiliser la fonction format()
With open ("fichier.txt", "w") as f:
foriinrange(1, 13):
f.write("{}^2 = {}\n".format(i, i**2)) #pour rentrer à la ligne après chaque opération on utilise le retour
chariot : \n
Exercice : fichier
Le code ci-dessous permet de créer un fichier qui contient les carrée des nombres ailant de 0 jusqu'a 19.
L'exercice consiste à implémenter un code qui permet de lire ce fichier et d'écrire chaque ligne dans une
liste.
Note_1 : la fonction read().splitlines() sera très utile
Note_2 : Pour un meilleur résultat, essayer d'utiliser une liste compréhension !
# Ce bout de code permet d'écrire le fichier
with open('fichier.txt', 'w') as f:
for i in range(0, 20):
f.write(f'{i}: {i**2}\n')
f.close()
Chapitre 5 : Modules
Python contient un certain nombre de modules (fichier contenant du code) intégrés, qui offrent de
nombreuses fonctions mathématiques, statistiques, aléatoires et os très utiles. Pour importer un module, il
faut procéder comme-ci dessous :
- import module (importe tout le module)
- import module as md (donne un surnom au module)
- from module import fonction (importe une fonction du module)
import math
import statistics
import random
import os
import glob
Vous pouvez également créer vos propres modules et les importer dans d'autres projets. Un module n'est
en fait qu'un simple fichier.py qui contient les fonctions, les classes, bref du code.
import test1 #où test1 est notre fichier python (test1.py) qui contient nos fonction, listes, dictionnaires, ...
res = test1.fibonacci(1000) #o appel la fonction fibonacci contenu dans test1.py
print(res)
Utiliser simplement import charge tout le contenu du module dans le module encours, on peut éviter cet
opération en précisant la fonction, la classe, … qu’on veut importer :
from test1 import fibonacci as fib
res = fib(1000)
print(res)
On peut accéder à la documentation python pour avoir accès à nombreux outils et modules disponible
pour faire du développement sur python
liste = [1, 4, 6, 2, 5]
Imaginons que nous avons plusieurs fichiers texte (un qui contient des noms de ville, un autre les noms de
pays, un fichier qui contient les fruits et leurs prix et un dernier qui contient des tables de multiplications)
que nous voulons analyser dans notre répertoire de travail courant. Nous pouvons donc utiliser toutes ces
données à la chaine à l’aide de la fonction glob() et de la fonction open()
import glob
filenames = glob.glob('*.txt')
for file in filenames:
with open(file, 'r' ) as f:
print(f.read())
Chapitre 6 : POO
La programmation orientée objet est un paradigme, c'est à dire une façon de procéder pour écrire des
programmes clairs et simples. Le principe est de modéliser les éléments de notre programmes (comme les
tableaux et les listes) comme étant des objets caractérisés par des attributs et capables d'effectuer des
actions. Ces objets sont construits à partir de classes qui contiennent leur plan de fabrication. Dans le
langage Python, presque tout est construit pour être un objet : les listes, les dictionnaires, les tableaux
numpy, etc. Par exemple quand on écrit : list.append(), on utilise en fait la méthode append() sur un objet
liste. La documentation Python, Numpy, Pandas, Matplotlib, Sklearn, est donc en vaste majorité
constituée de classes qu'il est important de savoir déchiffrer pour pouvoir apprendre soi-même de
nouvelles choses grâce aux documentations. Voici donc comment créer simplement et efficacement des
classes :
Class vehicule:
"""
Voici un exemple de classe "vehicule" qui contient le plan de conception
d'objets "véhicules"
"""
# Une classe commence par une fonction initialisation qui contient les différents attributs
Def __init__(self, couleur='noir', vitesse=0, roues=4):
self.couleur = couleur
self.vitesse = vitesse
self.roues = roues
- class est un mot clé, vehicule le nom de la classe. Cette ligne alerte l'interpréteur : je veux créer un
objet Python de type class, une nouvelle classe (et non pas un objet de type vehicule qui, lui, sera
créé plus loin). La classe vehicule hérite de la classe object, c'est à dire que tous les attributs de la
classe object peuvent être utilisés par notre nouvelle classe.
- un docstring (""" ente """) pour expliquer le fonctionnement
- la première méthode est un constructeur (méthode spéciale) : __init__ ses quatre arguments sont :
o self : désigne l'objet non encore instancié, de type vehicule, qui appellera cette méthode.
Autrement dit, self est un vehicule, qui n'existe pas encore. De manière analogue, au moment
de la définition d'une fonction (par exemple def f(x) : return x*x) ;x ne désigne aucune variable,
mais prendra corps seulement lorsque la fonction sera appelée par exemple
a=3; f(a).
o couleur, vitesse et roues sont les attributs de la voiture, (par défaut noir, 0 et 4) Il y a création
de trois et couleur, vitesse et roues, dans self. Ces attributs prendront corps en même temps que
self, lorsqu’un vehicule sera instancié.
- accelerer() est une méthode qui modifie la vitesse. L'argument self prendra la valeur
vehicule v lorsque sera exécutée l'instruction v. accelerer()
- Instanciation. L’instruction : voiture_1 =vehicule (couleur='rouge') déclenche les actions suivantes
: appel à vehicule.__init__( couleur='rouge') , =⇒voiture_1 est instancié. Les attributs
voiture_1.couleur, voiture_1.vitesse et voiture_1.roues deviennent effectif, à l'intérieur de
voiture_1.
def afficher(self):
super().afficher()
print(f'autonomie: {self.autonomie}')
voiture_2 = voiture_electrique() # création d'un objet de la classe voiture de type voiture électrique
voiture_2.afficher() #utilisation de la méthode affiche pour afficher les propriétés de la voiture électrique
Un tableau a une dimension ressemble a une liste, mais est beaucoup plus puissant, plus rapide, prend
moins d’espace en mémoire et gère beaucoup plus de méthodes pur faire des calcules scientifiques. Nous
utiliserons principalement les tableaux à
deux dimensions où les lignes peuvent
représenter les exemples du Dataset et
les colonnes les variables.
dimensions. Dans chaque case on peut stocker la valeur du pixel correspond, sachant que les valeurs
partent de 0 a 255 où 0 représente le noir et 255 le blanc.
L’image suivante peut être représentée sur environs 800 lignes et 1050 colonnes.
Par contre si cette image est prise en couleur on pourra donc la décomposer en 3 couleurs vert, bleu et
rouge, chacune étant sur deux dimensions. On aura donc un tableau sur 3 dimensions (chaque dimension
représentant une couleur). Sur chaque couche on aura une valeur de pixel différente et c’est l’assemblage
des trois couches qui va donner la couleur finale pour chaque pixel.
Pour accéder a la liste complète des méthodes, routines, fonctions, … utilisables dans Numpy :
https://numpy.org/doc/stable/reference/
B = np.eye(4, dtype=np.bool) # créer une matrice identité et convertit les éléments en type bool.
A = np.linspace(1,10, 100) # tableau d'entiers en distribution égale de 100 valeurs allant de 1 a 10
B = np.arange(0, 10, 1)# tableau d'entiers de valeurs comprises entre 0 et 10 avec un pas, ici 1
On assemble deux tableaux de nombre de colonne identique: on superpose les lignes et le nombre de
colonne reste identique
Onassemble deux tableaux de nombre de ligne identique: on superpose les colonnes et le nombre de ligne
reste identique
E = np.concatenate((A, B), axis=1) # axe 1 : équivalent de np.hstack((A, B))
F = np.hstack((A, B))
print("tab3 :", E, "\n","tab4 :", F)
return X
# Indexing
# Pour accéder a la ligne 0, colonne 1
A[0, 1]
# Pour accéder a tous les éléments de la ligne 0
A[0] #équivalent à A[0, :]
# Pour accéder a tous les éléments de la ligne 1
A[1] #équivalent à A[1, :]
# slicing
# Pour sélectionner les blocs de la ligne (0-1) colonne (0-1)
A[0:2, 0:2]
# Pour modifier les valeurs d'un les blocs de la ligne (0-1) colonne (0-1) sélectionner
A[0:2, 0:2] = 10
print(A)
A[A<5] = 4# convertit les valeurs sélectionnées en leur attribuant une nouvelle valeur, ici 4
print(A)
A[(A<5) & (A>2)] = 10# convertit les valeurs sélectionnées en leur attribuant une nouvelle valeur, ici 10
print(A)
A[A<5] # retourne le tableau A pour lequel les valeur sont inferieur à 5, changeant ainsi la forme du tableau
print(A)
print(A.shape)
Exercices et Solutions
Exercice 1 : matrice
Remplir les 4 blocs du milieu de la matrice suivante par des "1" :
B = np.zeros((4, 4))
Exercice 2 : tableau
Remplir le tableau de "1" (une ligne sur deux, une colonne sur deux)
C = np.zeros((5, 5))
Exercice 3 : slicing
Sur l'image ci dessous, effectuer un slicing pour reduire l’image d’un
quart de chaque coté (ne garder que le centre) et remplacer tous les
pixels > 150 par des pixels = 255
import numpy as np
from scipy import misc# le package qui contient l’image
import matplotlib.pyplot as plt# le package qui permet l’affichage de l’image
Corrélation de Pearson :
B = np.random.randn(3, 3) # nombres aléatoires 3x3
#np.unique() :
np.random.seed(0)
A = np.random.randint(0, 10, [5,5])
print(A)
Il est parfois utile de connaitre le nombre de fois qu’un élément apparait dans un tableau. On peut donc
utiliser la fonction np.unique pour compter ces éléments. La fonction nous retourne deux variables, une
qui contient les valeurs comprise dans le tableau et une qui correspond au nombre de fois que chacune des
valeurs apparait. Il est possible de classer ses éléments en fonction de leurs nombre d’appariations dans le
tableau avec la fonction argsort()
print(np.unique(A)) #retourne chaque élément qui apparait dans la matrice
Exercice
Exercice 1 : Standardisation
Standardisez la matrice suivante, c'est à dire effectuez le calcul suivant :
np.random.seed(0)
A = np.random.randint(0, 100, [10, 5])
print(A)
Exercice 2 : image
Soit la solution de l’exercice 3 précédent (sur l’image), calculer le nombre de fois qu’apparait chaque
pixel. On veillera a mettre le résultat sous la forme :
La valeur 3 apparait 17 fois
La valeur 6 apparait 17 fois
La valeur 5 apparait 18 fois
La valeur 0 apparait 20 fois
import numpy as np
from scipy import misc # le package qui contient l’image
import matplotlib.pyplot as plt # le package qui permet l’affichage de l’image
face = misc.face(gray=True) # on charge l’image en noir sur blanc (pour avoir 1 dim)
plt.imshow(face, cmap=plt.cm.gray) # on affiche l’image en définissant la couleur
plt.show()# on lance la fenêtre qui contient l’image
print(face.shape) #(768, 1024)
Lorsque nous faisons des opérations sur des tableaux de dimensions différentes en principe nous obtenons
une erreur.
import numpy as np
np.random.seed(0)
A = (np.random.randint(0, 10, [2,3]))
print(A)
B = np.ones((2, 2))
print(A)
print("Somme : ", A + B) #erreur
Mais avec Numpy, pas forcement. Si le tableau peut être étendu, alors l’opération peut être effectuée.Pour
cela, l’un des tableaux va être étendu: c’est ce qu’on appel le BROADCASTING. Par exemple si on fait
le tableau A + 2, où 2 est un scalaire et donc un tableau de dimension (1, 1) ; ce tableau sera étendu pour
s’additionner au reste des indices du tableau A.
import numpy as np
A = np.ones((2, 3))
B = 3
print(A+B) # résultat
De même si nous avons un vecteur B on eut faire l’opération. Ce tableau sera étendu pour s’additionner
au reste des indices du tableau A.
B = np.ones((2,1)) #B est de dimensions 2 lignes 1 colonne
print(B)
Il y’a toutefois des règles à respecter : chacune des dimensions dans A et B doivent être égale ou égales à
1. Si les deux tableaux sont différents, l’une des dimensions doit être égale dans les deux tableaux et
l’autre égale à 1 dans l’un des tableaux. Dans le cas des matrices lignes et des matrices colonnes, les deux
tableaux font s’étendre mutuellement pour s’additionner.
A = np.ones((2, 3))
print(A)
B = np.ones((2, 1)) # B a une colonne, elle sera étendu sur les trois colonnes de A
print(B)
print("Somme : ", A + B) # résultat
A = np.ones((2, 3))
print(A)
B = np.ones((1, 3)) # B a trois colonnes et une ligne, elle sera étendu sur les deux lignes de A
print(B)
print("Somme : ", A + B) # résultat
A = np.ones((2, 3))
print(A)
B = np.ones((2, 2)) # B a deux colonnes et deux ligne, elle ne sera pas étendu
print(B)
print("Somme : ", A + B) # Erreur
Note : évitez toutefois de travailler en broadcasting avec des dimensions incomplètes du genre (3,) pour
éviter d’avoir des résultatsinattendus. En fait (3,) donnerait 3 lignes et une colonne, mais en broadcasting
ce résultat ne sera pas obtenu. Il faut donc pensez à bien redimensionner nos matrice du genre (3,1) en
utilisant la méthode reshape.