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.
Calcul vectorisé du chiffre d'affaires
À partir des tableaux
prixetquantites: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 = ...Statistiques par axe
notescontient 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 = ...Combiner des conditions
Quelle expression sélectionne les valeurs de
acomprises 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
Que vaut
np.array([1, 2, 3]) * 2?- [1, 2, 3, 1, 2, 3]
- array([2, 4, 6])
- Une erreur
Sur un tableau de forme (3, 4), quelle forme a
t.sum(axis=0)?- (3,)
- (4,)
- (3, 4)
Que renvoie
(np.array([5, 15, 25]) > 10).sum()?- 2
- 40
- True
La suite du cours
- pandas : Series, DataFrame et lecture de données15 min
- Sélectionner, filtrer et trier20 min
- Créer et transformer des colonnes20 min
- Agréger : groupby et tableaux croisés20 min
- Combiner des tables : merge et concat20 min