NumPy : tableaux et calcul vectorisé

Première leçon du cours Analyse de données avec pandas et NumPy, en accès libre : environ 15 minutes, 3 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Créer des tableaux NumPy et connaître leurs attributs (shape, dtype)
  • Effectuer des calculs vectorisés sans boucle
  • Filtrer un tableau avec un masque booléen et calculer des statistiques

Tableaux ndarrayCalcul vectoriséMasques booléens

NumPy : tableaux et calcul vectorisé

NumPy est la bibliothèque de calcul numérique sur laquelle reposent pandas, scikit-learn et la plupart des outils data en Python. Sa brique de base est le tableau (ndarray) : une grille de valeurs d’un même type, stockée de façon compacte en mémoire.

Créer un tableau

import numpy as np   # alias universel

prix = np.array([49.0, 19.0, 189.0, 25.5])
print(prix.shape)    # (4,)     : 4 éléments sur une dimension
print(prix.dtype)    # float64  : tous les éléments ont le même type

np.arange(0, 10, 2)  # array([0, 2, 4, 6, 8])
np.zeros(3)          # array([0., 0., 0.])
np.linspace(0, 1, 5) # 5 valeurs régulières entre 0 et 1

Calculer sans boucle : la vectorisation

Avec une liste, pour appliquer une TVA, il faut une boucle ou une compréhension. Avec NumPy, on écrit l’opération directement sur le tableau :

prix_ttc = prix * 1.2        # chaque élément est multiplié
quantites = np.array([3, 10, 1, 4])
ca = prix * quantites        # multiplication élément par élément
print(ca.sum())              # 628.0

Ce calcul vectorisé est exécuté en code compilé : sur un million de valeurs, il est des dizaines de fois plus rapide qu’une boucle Python. Le fait de combiner un tableau et un simple nombre (prix * 1.2) s’appelle le broadcasting : NumPy « étire » le nombre à la taille du tableau.

Attention : avec une liste, [1, 2] * 2 donne [1, 2, 1, 2] (répétition), alors qu’avec NumPy np.array([1, 2]) * 2 donne [2, 4].

Filtrer avec un masque booléen

Une comparaison sur un tableau renvoie un tableau de booléens, appelé masque :

masque = prix > 30
print(masque)              # [ True False  True False]
print(prix[masque])        # [ 49. 189.]  : seuls les True sont gardés
print(prix[(prix > 20) & (prix < 100)])   # [49.  25.5]
print(masque.sum())        # 2 : True compte comme 1

Pour combiner des conditions, utilisez & (et), | (ou), ~ (non) et mettez chaque condition entre parenthèses. Les mots-clés and / or ne fonctionnent pas sur des tableaux.

Tableaux à deux dimensions et axis

# ventes : 3 magasins (lignes) x 4 trimestres (colonnes)
ventes = np.array([[10, 12, 9, 14],
                   [ 8,  7, 11, 10],
                   [15, 14, 13, 18]])
print(ventes.shape)          # (3, 4)
print(ventes[0, 2])          # 9 : ligne 0, colonne 2
print(ventes.sum(axis=1))    # [45 36 60] : total par magasin (on réduit les colonnes)
print(ventes.mean(axis=0))   # moyenne par trimestre (on réduit les lignes)
print(ventes.max())          # 18 : sur tout le tableau

Retenez : axis=0 agrège le long des lignes (un résultat par colonne), axis=1 agrège le long des colonnes (un résultat par ligne).

À retenir

  • Un tableau NumPy a un type unique et une forme (shape).
  • Les opérations sont vectorisées : pas de boucle.
  • Filtrez avec des masques et &, |, ~ entre parenthèses.

Exercices

Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.

  1. CodeDifficulté 1Python dans le navigateur2 indices

    Calcul vectorisé du chiffre d'affaires

    À partir des tableaux prix et quantites :

    • ca : le tableau du chiffre d’affaires par produit ;
    • ca_total : la somme totale ;
    • nb_gros : le nombre de produits dont le CA dépasse strictement 100 ;
    • ca_gros : le tableau des CA supérieurs à 100.

    N’utilisez aucune boucle.

    import numpy as np
    
    prix = np.array([49.0, 19.0, 189.0, 12.5, 75.0])
    quantites = np.array([3, 10, 1, 4, 2])
    
    ca = ...
    ca_total = ...
    nb_gros = ...
    ca_gros = ...
  2. CodeDifficulté 2Python dans le navigateur2 indices

    Statistiques par axe

    notes contient les notes de 4 élèves (lignes) à 3 évaluations (colonnes).

    Calculez :

    • moy_eleves : la moyenne de chaque élève (tableau de 4 valeurs) ;
    • moy_evals : la moyenne de chaque évaluation (3 valeurs) ;
    • nb_admis : le nombre d’élèves dont la moyenne est ≥ 10 ;
    • notes_bonus : les notes augmentées de 1 point, plafonnées à 20 (np.minimum).
    import numpy as np
    
    notes = np.array([[12, 9, 15],
                      [8, 7, 10],
                      [19, 18, 20],
                      [10, 11, 9]])
    
    moy_eleves = ...
    moy_evals = ...
    nb_admis = ...
    notes_bonus = ...
  3. QCMDifficulté 21 indice

    Combiner des conditions

    Quelle expression sélectionne les valeurs de a comprises entre 10 et 20 (exclus) ?

    • a[a > 10 and a < 20]
    • a[(a > 10) & (a < 20)]
    • a[a > 10 & a < 20]
    • a[10 < a < 20]

Quiz de fin de leçon

  1. Que vaut np.array([1, 2, 3]) * 2 ?

    • [1, 2, 3, 1, 2, 3]
    • array([2, 4, 6])
    • Une erreur
  2. Sur un tableau de forme (3, 4), quelle forme a t.sum(axis=0) ?

    • (3,)
    • (4,)
    • (3, 4)
  3. Que renvoie (np.array([5, 15, 25]) > 10).sum() ?

    • 2
    • 40
    • True

La suite du cours

  1. pandas : Series, DataFrame et lecture de données15 min
  2. Sélectionner, filtrer et trier20 min
  3. Créer et transformer des colonnes20 min
  4. Agréger : groupby et tableaux croisés20 min
  5. Combiner des tables : merge et concat20 min

Analyse de données avec pandas et NumPy · Intermédiaire · 3 h 20