NumPy : calculer sur des tableaux
Les bibliothèques
Dans le projet de Mama Brigitte, tu as tout écrit toi-même : la lecture du fichier, les boucles, les regroupements. C'était la meilleure façon de comprendre. Mais des millions de programmeurs ont eu les mêmes besoins avant toi, et certains ont écrit des outils excellents, testés, très rapides, qu'ils partagent gratuitement.
import math
print(math.sqrt(16)) # 4.0
Python est livré avec des dizaines de bibliothèques (math, random, csv...). Les autres s'installent. Sur ton PC, on les installe dans le terminal avec pip, le gestionnaire de paquets de Python :
pip install numpy pandas
Dans l'appli, rien à installer : la première fois qu'un exercice importe une bibliothèque, elle est téléchargée automatiquement (quelques secondes, puis elle reste sur ton appareil).
Le tableau NumPy
import numpy as np
prix = np.array([1200, 1500, 500, 900])
print(prix * 2) # [2400 3000 1000 1800]
Avec une liste, [1200, 1500] * 2 donne [1200, 1500, 1200, 1500] : la liste est répétée. Avec un tableau, chaque élément est multiplié. Plus besoin de boucle.
Les opérations marchent aussi entre deux tableaux de même longueur, élément par élément :
quantites = np.array([5, 10, 1, 2])
prix = np.array([1200, 1500, 500, 900])
montants = quantites * prix # [6000 15000 500 1800]
Et les tableaux ont leurs méthodes de résumé :
| Écriture | Résultat |
|---|---|
montants.sum() |
la somme : 23300 |
montants.mean() |
la moyenne : 5825.0 |
montants.max(), montants.min() |
le plus grand, le plus petit |
montants.argmax() |
la position du plus grand : 1 |
len(montants) |
le nombre d'éléments : 4 |
Pratique : Tes premiers tableaux
Tape chaque ligne et prévois le résultat. La première ligne peut prendre quelques secondes la première fois : NumPy se télécharge.
Un terminal simulé t'attend dans l'appli, sans rien installer. Pratiquer
Filtrer avec un masque
Dans la console, notes >= 10 a donné un tableau de True et de False, un par note :
notes = np.array([12, 8, 15, 10, 17])
notes >= 10 # [ True False True True True]
notes[notes >= 10] # [12 15 10 17] : les admis
(notes >= 10).sum() # 4 : le nombre d'admis
Pourquoi .sum() compte-t-il ? Parce que dans un calcul, True vaut 1 et False vaut 0. Faire la somme d'un masque, c'est compter les True.
Pour combiner deux conditions, NumPy utilise & (et) et | (ou), avec des parenthèses autour de chaque condition :
notes[(notes >= 10) & (notes < 15)] # [12 10] : admis sans mention
Exercice : Le panier, sans boucle
Les quantités et les prix d'un panier sont donnés. Sans écrire de boucle, calcule :
montants: le tableau des montants de chaque ligne ;total: le total du panier ;plus_cher: le montant de la ligne la plus chère.
Voir une solution
import numpy as np
quantites = np.array([3, 2, 20, 6])
prix = np.array([500, 1200, 1500, 400])
montants = quantites * prix
total = montants.sum()
plus_cher = montants.max()
print(montants, total, plus_cher)Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Exercice : Les résultats d'une classe
Avec le tableau notes, calcule sans boucle :
moyenne: la moyenne de la classe, arrondie à 2 chiffres après la virgule avecround(..., 2);nb_admis: le nombre de notes supérieures ou égales à 10 ;au_dessus: le tableau des notes strictement supérieures à la moyenne ;mention: le nombre de notes entre 14 inclus et 16 exclu (mention bien).
Voir une solution
import numpy as np
notes = np.array([12, 8, 15, 10, 17, 9, 14, 11, 6, 15]) # donné
moyenne = round(notes.mean(), 2)
nb_admis = (notes >= 10).sum()
au_dessus = notes[notes > moyenne]
mention = ((notes >= 14) & (notes < 16)).sum()Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Les tableaux à deux dimensions
Un tableau peut avoir des lignes et des colonnes, comme un tableau de notes : une ligne par élève, une colonne par matière.
# maths physique français
notes = np.array([[14, 12, 9], # Awa
[10, 15, 13], # Paul
[17, 16, 11]]) # Mireille
notes[1, 2] lit la case ligne 1, colonne 2 (Paul en français : 13). notes[:, 0] prend toutes les lignes de la colonne 0 : les notes de maths.
notes.mean(axis=0) # moyenne par matière : [13.67 14.33 11.]
notes.mean(axis=1) # moyenne par élève : [11.67 12.67 14.67]
C'est exactement la forme des données en machine learning : une ligne par exemple (un élève, une maison, un patient), une colonne par caractéristique.
Exercice : Moyennes par élève et par matière
Le tableau notes contient 4 élèves (lignes) et 3 matières (colonnes : maths, physique, français). Calcule :
par_eleve: la moyenne de chaque élève (un tableau de 4 nombres) ;par_matiere: la moyenne de chaque matière (un tableau de 3 nombres) ;meilleur: l'index de l'élève qui a la meilleure moyenne ;maths: la colonne des notes de maths.
Voir une solution
import numpy as np
notes = np.array([
[14, 12, 9],
[10, 15, 13],
[17, 16, 11],
[8, 11, 15],
])
par_eleve = notes.mean(axis=1)
par_matiere = notes.mean(axis=0)
meilleur = par_eleve.argmax()
maths = notes[:, 0]Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Teste-toi
Que vaut np.array([3, 4]) * 2, et que vaut [3, 4] * 2 ?
- Les deux valent
[6, 8] - Le tableau vaut
[6 8], la liste vaut[3, 4, 3, 4](bonne réponse) - Le tableau vaut
[3 4 3 4], la liste vaut[6, 8] - Les deux provoquent une erreur