NumPy
Département de Mathématiques et Informatique, Faculté des Sciences et Techniques, Université Cheikh Anta Diop de Dakar
Contenu
On entre dans la science des données avec un exemple de morphométrie : des mesures relevées sur des spécimens de pinsons (bec, aile, masse). numpy fournit le tableau (array), sur lequel on calcule sans boucle. C’est l’outil sur lequel repose pandas (Séance 7) et, plus loin, le Machine Learning.
np.array, types homogènes.L’entraînement se fait dans le notebook, avec une cellule « À vous » après chaque notion.
La vectorisation (une opération agit sur chaque valeur, sans boucle) et l’argument axis (résumer la table par mesure ou par spécimen).
L’idée en une phrase
Un tableau NumPy est une collection de nombres de même type, conçue pour le calcul. On importe NumPy sous le nom np, et on crée un tableau avec np.array(...). Ici, la masse (en g) de 6 spécimens de pinsons.
Le tableau ressemble à une liste, mais il autorise des opérations globales (sur tous les éléments à la fois) qui n’existent pas sur les listes.
Résultat →
[15 16 21 22 28 27]
np est le nom conventionnel de NumPy. Le tableau s’affiche sans virgules.
Résultat →
[ 9.1 8. 12.8]
Un tableau ne contient qu’un seul type. Comme les mesures de bec sont décimales, tout le tableau est flottant (le point après chaque nombre le signale).
L’idée en une phrase
Une opération sur un tableau (+, *, une comparaison) s’applique à chaque élément d’un seul coup, sans boucle. C’est la vectorisation : un code plus court, plus lisible, et bien plus rapide.
Résultat →
[17 18 23 24 30 29]
[30 32 42 44 56 54]
masse + 2 ajoute 2 à chaque masse ; masse * 2 double chaque masse. Aucune boucle.
Résultat →
129
129
Même résultat : NumPy remplace la boucle d’accumulation par un simple .sum().
* agit élément par élémentCe n’est pas un produit matriciel
masse * masse élève chaque masse au carré, case par case.
Résultat →
[225 256 441 484 784 729]
\(15^2 = 225\), \(16^2 = 256\), etc. Le produit matriciel, lui, s’écrit avec @ — hors de notre programme.
Résultat →
129
21.5
15
28
La masse moyenne vaut 21.5 g. L’écart-type mesure la dispersion ; il tombe rarement rond, on l’arrondit :
4.92
Résultat →
[False False True True True True]
[21 22 28 27]
4
La comparaison produit un masque de True/False ; placé entre crochets, il sélectionne les spécimens d’au moins 20 g ; .sum() sur un masque les compte (4, sans doute les plus grandes espèces).
L’idée en une phrase
On a mesuré 4 caractères par spécimen. On les range dans un tableau 2D : une ligne par spécimen, une colonne par mesure (longueur de bec, hauteur de bec, aile, masse). shape donne le format (spécimens, mesures).
Résultat →
[[ 9.1 8. 67. 15. ]
[ 9.4 8.3 68. 16. ]
[12.8 10.5 74. 21. ]
[13.2 10.9 75. 22. ]
[16.1 14.2 80. 28. ]
[15.7 13.8 79. 27. ]]
(6, 4)
Résultat →
9.1
[ 9.1 8. 67. 15. ]
[ 9.1 9.4 12.8 13.2 16.1 15.7]
[15. 16. 21. 22. 28. 27.]
[spécimen, mesure] pour une valeur ; X[0] un spécimen entier ; X[:, 0] la colonne des becs ; X[:, 3] celle des masses (le : veut dire « tous les spécimens »).
L’idée en une phrase
Sur un tableau 2D, une agrégation se fait par colonne ou par ligne, selon axis. axis=0 descend les colonnes : une valeur par mesure. axis=1 parcourt les lignes : une valeur par spécimen.
Résultat →
[12.72 10.95 73.83 21.5 ]
[24.78 25.42 29.58 30.28 34.58 33.88]
axis=0 : moyenne de chaque mesure (bec 12.72 mm, aile 73.83 mm, masse 21.5 g) — ce qui a un sens. axis=1 mélange des unités (mm et g) : correct, mais peu parlant — d’où la normalisation, juste après.
L’idée en une phrase
Le broadcasting permet d’opérer entre un tableau 2D et un vecteur : le vecteur est appliqué à chaque ligne. Ici, on retire à chaque mesure sa propre moyenne (calculée par axis=0).
Résultat →
[[-3.62 -2.95 -6.83 -6.5 ]
[-3.32 -2.65 -5.83 -5.5 ]
[ 0.08 -0.45 0.17 -0.5 ]
[ 0.48 -0.05 1.17 0.5 ]
[ 3.38 3.25 6.17 6.5 ]
[ 2.98 2.85 5.17 5.5 ]]
Le vecteur des moyennes par colonne est soustrait à chaque ligne : NumPy l’étend automatiquement à toute la hauteur du tableau.
Des unités différentes
Bec et aile en mm, masse en g : pour comparer les mesures, on normalise chaque colonne — retirer la moyenne, diviser par l’écart-type.
Résultat →
[1. 1. 1. 1.]
Après normalisation, chaque mesure a une moyenne de 0 et un écart-type de 1 : toutes sont ramenées à une échelle commune, quelle que soit leur unité. Ce geste est systématique en morphométrie comme avant d’entraîner un modèle.
* n’est pas le produit matriciel : il multiplie élément par élément.axis : axis=0 par mesure (colonne), axis=1 par spécimen (ligne).L’essentiel
Créer : import numpy as np puis np.array([...]) ; éléments de même type.
Vectorisation : une opération s’applique à tout le tableau, sans boucle.
Agrégations : .sum(), .mean(), .std(), .min(), .max().
Filtrage : masque tableau >= v, puis tableau[masque].
2D : shape donne (spécimens, mesures) ; accès [i, j], [:, j] (mesure), [i, :] (spécimen).
axis : axis=0 par mesure, axis=1 par spécimen.
Normalisation (z-score) : (X - X.mean(axis=0)) / X.std(axis=0) ramène chaque mesure à une moyenne de 0 et un écart-type de 1.
Séance 7 — pandas
NumPy calcule sur des tableaux de nombres. pandas, bâti sur NumPy, ajoute des colonnes nommées et une colonne espece : le DataFrame, la table de données de la bio-informatique. On y manipulera la table complète des pinsons — tris, groupes par espèce, valeurs manquantes.
À faire d’ici là : refaire les cellules « À vous » du notebook de la séance.