28/10/2022
Manipulation des matrices avec numpy
Création, accès, extraction et calcul
Dr Riadh BOUSLIMI
Numpy ?
• Numpy est un package pour Python spécialisé dans la manipulation des
tableaux (array), pour nous essentiellement les vecteurs et les matrices
• Les tableaux « numpy » ne gère que les objets de même type
• Le package propose un grand nombre de routines pour un accès rapide
aux données (ex. recherche, extraction), pour les manipulations diverses
(ex. tri), pour les calculs (ex. calcul statistique)
• Les tableaux « numpy » sont plus performants (rapidité, gestion de la
volumétrie) que les collections usuelles de Python
•Les tableaux « numpy » sont sous-jacents à de nombreux packages
dédiés au calcul scientifique sous Python.
• Une matrice est un tableau (array) à 2 dimensions
Il n’est pas possible de tout aborder dans ce support. Pour aller plus loin, voir
absolument le manuel de référence (utilisé pour préparer ce diaporama).
http://docs.scipy.org/doc/numpy/reference/index.html
2
28/10/2022
Création à la volée, génération d’une séquence, chargement à partir d’un fichier
CRÉATION D’UNE MATRICE
Création via une saisie manuelle
Préalable important : np sera l’alias utilisé pour accéder
import numpy as np aux routines de la librairie « numpy ».
importer le module
« numpy »
Création manuelle à partir a = np.array([[1.2,2.5],[3.2,1.8],[1.1,4.3]]) Noter le rôle des [ ] et
[ ] pour délimiter les
d’un ensemble de valeurs
portions de la matrice
1.2
2.5
#type de la structure
3.2
print(type(a)) #<class ‘numpy.ndarray’>
1 #type des données
print(a.dtype) #float64
#nombre de dimensions
Informations sur la
print(a.ndim) #2 (car c’est une matrice)
structure #nombre de lignes et col, shape renvoie un tuple
print(a.shape) #(3,2) 3 lignes et 2 colonnes
#nombre totale de valeurs
print(a.size) #6, nb.lignes x nb.colonnes
4
4
28/10/2022
Typage des données
Affichage d’une matrice #print de l’ensemble
dans la console (IPython) print(a)
#création et typage implicite
a = np.array([[1,2],[4,7]])
Le typage des valeurs print(a.dtype) #int32
peut être implicite ou
#création et typage explicite – préférable !
explicite
a = np.array([[1,2],[4,7]],dtype=float)
print(a.dtype) #float64
Tout comme pour les vecteurs, la création d’une matrice
d’objets complexes (autres que les types de base) est possible
Création d’une matrice à partir d’une séquence de valeurs
arange() génère une séquencede valeurs, 0 à 9.
#création à partir d'une séquence reshape() se charge de les réorganiseren matrice
#attention les dim. doivent être compatibles 2 lignes et 5 colonnes.
a = np.arange(0,10).reshape(2,5)
print(a)
#un vecteur peut être converti en matrice
a = np.array([2.1,3.4,6.7,8.1,3.5,7.2])
print(a.shape) # (6,)
#redim. en 3 lignes x 2 col.
b = a.reshape(3,2)
print(b.shape) # (3, 2)
print(b)
#matrices de valeurs identiques
#ex. pour une initialisation
a = np.zeros(shape=(2,4))
print(a)
#plus généralement
a = np.full(shape=(2,4),fill_value=0.1)
print(a)
6
28/10/2022
Chargement à partir d’un fichier - Conversions
Les données peuvent être Remarque : si besoin, modifier le répertoire par défaut avec la
stockées dans un fichier fonction chdir() du module os (qu’il faut importer au préalable)
texte (loadtxt pour charger,
savetxt pour sauver) #charger à partir d'un fichier, typage explicite
#séparateur de colonne = tabulation « \t »
a = np.loadtxt("matrice.txt",delimiter="\t",dtype=float)
print(a)
La première ligne doit être
ignorée dans ce fichier, d’où le
symbole # en début de 1ère ligne.
#liste de valeurs
Conversion d’une lst = [1.2,3.1,4.5,6.3]
collection (type standard print(type(lst)) # <class ‘list’>
Python) en type array de #conversion à partir d'une liste : 2 étapes asarray() et reshape()
« numpy » a = np.asarray(lst,dtype=float).reshape(2,2)
print(a)
Redimensionnement
#matrice de valeurs
a= a = np.array([[1.2,2.5],[3.2,1.8],[1.1,4.3]])
#ajouter une ligne – marche pour la concaténation de matrices
Accoler le vecteur b en tant que
nouvelle ligne (axis = 0) de la b = np.array([[4.1,2.6]])
c = np.append(a,b,axis=0)
matrice a
print(c)
Accoler le vecteur d en tant que #ajouter une colonne
nouvelle colonne (axis = 1) de la d = np.array([[7.8],[6.1],[5.4]])
matrice a print(np.append(a,d,axis=1))
Insertion de b en tant que nouvelle #insertion
ligne (axis = 0) à la position n°1 print(np.insert(a,1,b,axis=0))
Suppression de la ligne (axis = 0) #suppression
via son indice (n°1) print(np.delete(a,1,axis=0))
#modifier la dimension d'une matrice existante
#parcourt les données lignes par ligne
Redimensionnement
h = np.resize(a,new_shape=(2,3))
d’une matrice
print(h)
8
28/10/2022
Accéder aux valeurs via des indices ou des conditions
EXTRACTION DES VALEURS
Accès indicé – Plages d’indices
v = np.array([[1.2,2.5],[3.2,1.8],[1.1,4.3]])
#affichage de la structure dans son ensemble
print(v) v=
#accès indicé - première valeur
print(v[0,0]) # 1.2
#dernière valeur – noter l’utilisation de shape (qui est un tuple)
print(v[v.shape[0]-1,v.shape[1]-1]) # 4.3
#autre solution pour affichage de toutes les valeurs, noter le rôle des :
print(v[:,:])
Remarques :
#plage d'indices contigus : lignes 0 à 1 (2 non inclus), toutes les colonnes (1)Mis à part les
print(v[0:2,:])
singletons, les matrices
#extrêmes, début to 2 (non-inclus) générées sont de type
print(v[:2,:])
numpy.ndarray
#extrêmes, lignes 1 à dernière (2)Toutes comme pour
print(v[1:,:])
les vecteurs, il est
#indice négatif – dernière ligne et toutes les colonnes possible d’utiliser un
print(v[-1,:]) vecteur d’indices non
#indices négatifs – deux dernières lignes et toutes les colonnes contigus.
print(v[-2:,:])
10
10
28/10/2022
Accès par conditions – Indiçage booléen
v=
#indiçage par vecteur de booléens
#si b trop court, tout le reste est considéré False
#si b trop long, erreur
b = np.array([True,False,True],dtype=bool)
print(v[b,:])
#exemple illustratif : extraire la lignes dont la somme est la plus petite
#calculer la somme des colonnes pour chaque ligne
s = np.sum(v,axis=1)
print(s) # [ 3.7 5. 5.4 ]
#repérer les lignes dont la somme est égale au minimum
#il est possible qu’il y en ait plusieurs
b = (s == np.min(s))
print(b) # [ True False False]
Remarquer la configuration des
#application du filtre booléen
crochets [ ] : on a une matrice à
print(v[b,:]) 1 ligne et 2 colonnes.
11
11
Tri et recherche
v=
#recherche valeur max des lignes (axis = 0) pour chaque colonne
print(np.max(v,axis=0)) # [ 3.2 4.3 ] -- décryptage : 3.2 est la max des lignes
pour la colonne 0, 4.3 est la max des lignes pour la colonne 1
#recherche valeur max des colonnes (axis = 1) pour chaque ligne
print(np.max(v,axis=1)) # [ 2.5 3.2 4.3]
#recherche indice de valeur max des lignes (axis = 0)pour chaque colonne
print(np.argmax(v,axis=0)) # [ 1 2 ]
#tri des lignes (axis = 0) pour chaque colonne
#la relation entre les valeurs d'une même ligne est perdue !!!
print(np.sort(v,axis=0))
#récupération des indices triés
print(np.argsort(v,axis=0))
12
12
28/10/2022
Stratégies pour parcourir une matrice
ITÉRATIONS
13
13
Parcours d’une matrice : boucle indicées
Avec les indices, nous pouvons accéder aux valeurs de la matrice v=
comme bon nous semble (ligne par ligne ou colonne par colonne)
#boucles indicées
s = 0.0
for i in range(0,v.shape[0]):
for j in range(0,v.shape[1]):
print(v[i,j])
s = s + v[i,j]
print("Somme = ",s)
14
14
28/10/2022
Parcours d’une matrice : les itérateurs
Avec les itérateurs, nous pouvons accéder aux valeurs de la
matrice sans avoir à recourir aux indices (ligne par ligne, v=
colonne par colonne)
#itérateur - accès ligne par ligne
s = 0.0
for x in np.nditer(v):
print(x)
s=s+x
print("Somme = ",s)
#itérateur - accès colonne par colonne
#"F" pour " Fortran order "
s = 0.0
for x in np.nditer(v,order="F"):
print(x)
s = s +x
print("Somme = ",s)
Les itérateurs de NumPy sont sophistiqués et puissants, voir :
http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html
15
15
Calculs statistiques
CALCULS SUR LES MATRICES
16
16
28/10/2022
Calculs (statistiques) récapitulatifs
Principe : les calculs
sont réalisés selon une v=
certaine organisation
des données (axis = #moyenne par colonne
None : toutes les print(np.mean(v,axis=0)) # [1.833 2.867]
valeurs prises
globalement ; axis = 0 #moyenne par ligne
: traitement par print(np.mean(v,axis=1)) # [1.85 2.5 2.7]
colonne ; axis = 1 :
traitement par ligne) #somme cumulée des valeurs pour chaque colonne
print(np.cumsum(v,axis=0))
#matrice de corrélation
#rowvar = 0 pour indiquer que les variables
#sont organisés en colonnes
m = np.corrcoef(v,rowvar=0)
print(m)
La librairie n’est pas très fournie, nous aurons besoin de SciPy (et autres)
17
17
Calcul le long d’un axe
Principe : A la manière
de la fonction apply() v=
de R, nous pouvons
définir des calculs le #moyenne par colonne : [1.833 2.867]
long d’un axe d’une print(np.apply_along_axis(func1d=np.mean,axis=0,arr=v))
matrice (0 par
colonne, 1 par ligne). #une fonction callback – étendue standardisée
Chaque colonne def etendue_std(x):
(ligne) est passée en res = (np.max(x) - np.min(x))/np.std(x)
paramètre à une return res
fonction callback.
#étendue normalisée par colonne : [2.171 2.374]
print(np.apply_along_axis(func1d=etendue_std,axis=0,arr=v))
#fonction peut-être définie à la volée avec lambda
print(np.apply_along_axis(func1d=lambda x:(np.max(x)-np.min(x))/np.std(x),axis=0,arr=v))
#cas où la fonction callback renvoie un vecteur
[[-0.65 -0.35] #nous obtenons une matrice. Ex. centrage-réduction
[ 1.41 -1.01]
print(np.apply_along_axis(func1d=lambda x:(x-np.mean(x))/np.std(x),axis=0,arr=v))
[-0.76 1.36]]
18
18
28/10/2022
NumPy donne sa pleine mesure pour le calcul matriciel
CALCUL MATRICIEL
19
19
Fonctions matricielles (1/2)
x= y=
#transposition
print(np.transpose(x))
#multiplication
print(np.dot(x,y))
#déterminant
print(np.linalg.det(y)) # 4.21
#inversion
print(np.linalg.inv(y))
20
20
28/10/2022
Fonctions matricielles (2/2)
x= y=
Solution de #résolution d'équation
Y.a = z
z = np.array([1.7,1.0])
print(np.linalg.solve(y,z)) # [0.8195 -0.0261]
On peut faire #vérification
a = Y-1.z print(np.dot(np.linalg.inv(y),z)) # [0.8195 -0.0261]
#matrice symétrique avec XTX
s = np.dot(np.transpose(x),x)
print(s)
#val. et vec. propres d'une matrice symétrique
print(np.linalg.eigh(s))
21
21
Références
Site de Python
Welcome to Python - https://www.python.org/
Python 3.4.3 documentation - https://docs.python.org/3/index.html
Portail Python
Page Python de Developpez.com
Quelques cours en ligne
P. Fuchs, P. Poulain, « Cours de Python » sur Developpez.com
G. Swinnen, « Apprendre à programmer avec Python » sur Developpez.com
« Python », Cours interactif sur Codecademy
POLLS (KDnuggets)
Data Mining / Analytics Tools Used
Python, 4ème en 2015
What languages you used for data mining / data science?
Python, 3ème en 2014 (derrière R et SAS)
22
22