ParcoursOuvrir l'appli

NumPy : calculer sur des tableaux

Données : NumPy et pandas · 50 min

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 avec round(..., 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 ?
  1. Les deux valent [6, 8]
  2. Le tableau vaut [6 8], la liste vaut [3, 4, 3, 4] (bonne réponse)
  3. Le tableau vaut [3 4 3 4], la liste vaut [6, 8]
  4. Les deux provoquent une erreur