- Apprendre
- Informatique et numérique
- Science des données et IA
- Python et pandas : NumPy, analyse et visualisation de données
- Tableaux NumPy et calcul vectorisé
Tableaux NumPy et calcul vectorisé
IntermédiaireUnité 1 sur 8 de la formation Formation : Python et pandas : NumPy, analyse et visualisation de données
Ce que tu vas apprendre
- Construire des tableaux NumPy à partir de données Python et avec les fonctions de création de NumPy, décrire un tableau par sa forme et son type de données, et choisir et convertir les types de données sans perdre d’informations par accident.
- Expliquer ce qu’est un tableau NumPy et en quoi il diffère d’une listeDécrire un tableau par ses dimensions, sa forme, sa taille et son type de données, et expliquer pourquoi les tableaux se comportent différemment des listes Python et offrent des performances différentes.
- Créer des tableaux à partir de listes et avec les fonctions de création de NumPyTransformer des listes en tableaux et générer des tableaux remplis, des suites de nombres et des grilles régulièrement espacées avec la forme et le type nécessaires.
- Choisir, examiner et convertir les types de donnéesLire et définir le type de données d’un tableau, prévoir le type choisi par NumPy et convertir les types en évitant la troncature, les dépassements de capacité et la perte des valeurs manquantes.
- Expliquer ce qu’est un tableau NumPy et en quoi il diffère d’une liste
- Extraire des valeurs isolées, des lignes, des colonnes et des blocs ; sélectionner à l’aide de listes de positions ou de conditions ; et savoir quand une sélection partage ses données avec le tableau d’origine.
- Indexer des tableaux à une ou deux dimensions et en extraire des tranchesUtiliser des positions et des tranches, une par axe, pour lire et modifier des éléments, des lignes, des colonnes et des blocs.
- Sélectionner des éléments à partir de listes de positions et distinguer les vues des copiesSélectionner des éléments, des lignes ou des colonnes à l’aide de tableaux d’entiers et prévoir si le résultat partage sa mémoire avec le tableau d’origine.
- Filtrer selon des conditions avec des masques booléens et np.whereConstruire des masques de valeurs vrai ou faux à partir de comparaisons, les combiner et les utiliser pour filtrer, compter, remplacer et choisir des valeurs.
- Indexer des tableaux à une ou deux dimensions et en extraire des tranches
- Réorganiser les mêmes valeurs selon une nouvelle forme, permuter lignes et colonnes, ajouter ou supprimer des axes de longueur 1, et assembler ou découper des tableaux selon un axe.
- Modifier la forme d’un tableau et permuter ses axesRemodeler, aplatir et transposer des tableaux, et ajouter ou supprimer des axes de longueur 1, tout en prévoyant l’ordre des valeurs.
- Assembler et découper des tableauxCombiner des tableaux selon un axe existant ou un nouvel axe, et découper un tableau en morceaux, en vérifiant que les formes conviennent.
- Modifier la forme d’un tableau et permuter ses axes
- Écrire des calculs sur des tableaux entiers au lieu de boucles élément par élément, appliquer les fonctions universelles de NumPy et combiner des tableaux de formes différentes à l’aide des règles de diffusion.
- Calculer élément par élément sans boucle expliciteUtiliser les opérateurs arithmétiques et de comparaison sur des tableaux entiers, et savoir comment ils traitent les formes, la division par zéro et les modifications en place.
- Appliquer des fonctions universelles à des tableaux entiersUtiliser les fonctions mathématiques de NumPy qui s’appliquent élément par élément, notamment les fonctions d’arrondi et celles qui prennent deux tableaux, et traiter les valeurs hors de l’ensemble de définition d’une fonction.
- Combiner des tableaux de formes différentes par diffusionAppliquer les règles de diffusion pour prévoir si deux formes peuvent être combinées et quelle sera la forme du résultat, et corriger les erreurs de forme en ajoutant un axe.
- Calculer élément par élément sans boucle explicite
- Réduire des tableaux à des totaux, moyennes, valeurs extrêmes, indicateurs de dispersion, médianes et effectifs, pour le tableau entier ou selon un axe choisi, et traiter correctement les valeurs manquantes et les sous-ensembles.
- Agréger un tableau entier ou selon un axeCalculer des sommes, des moyennes, des valeurs extrêmes, des positions, des sommes cumulées et des indicateurs de dispersion pour le tableau entier ou par ligne ou colonne, et prévoir la forme du résultat.
- Utiliser les médianes, les centiles, le tri et les valeurs distinctesDécrire la tendance centrale et la dispersion des données à l’aide de statistiques fondées sur leur ordre, trier les valeurs et les tableaux associés, et compter les valeurs distinctes.
- Calculer des indicateurs en tenant compte des valeurs manquantes et de conditionsRepérer, compter, supprimer et remplacer les valeurs manquantes, utiliser les agrégations ignorant les NaN et calculer des indicateurs uniquement sur les valeurs qui remplissent une condition ou appartiennent à un groupe.
- Agréger un tableau entier ou selon un axe
- Créer un générateur de nombres aléatoires initialisé par une graine, tirer des échantillons reproductibles selon des lois courantes, mélanger et échantillonner des données, et estimer des résultats avec des simulations vectorisées.
- Tirer des échantillons aléatoires reproductibles avec un objet GeneratorCréer un objet Generator avec une graine, tirer des entiers, des décimaux, des valeurs selon une loi normale et des échantillons dans une liste, mélanger des données et obtenir des résultats reproductibles.
- Réaliser des simulations vectoriséesEstimer des probabilités et des comportements à long terme en tirant toutes les valeurs aléatoires à la fois et en calculant des indicateurs par des opérations sur les tableaux.
- Tirer des échantillons aléatoires reproductibles avec un objet Generator
Tableaux NumPy et calcul vectorisé : cours
1Créer des tableaux et maîtriser leurs types de données
Les données numériques sont plus faciles à manipuler lorsque leur structure et leur type de stockage sont clairs. Construis des tableaux à partir de valeurs existantes ou d’une forme prévue, puis lis leurs dimensions, leur nombre d’éléments et leur type de données. Choisis les fonctions de création adaptées à tes données et observe les effets de la conversion, de l’arrondi, du dépassement de capacité et des valeurs manquantes sur ce que le tableau stocke réellement. Ces choix déterminent si les calculs ultérieurs conservent les informations dont tu as besoin.
1.1 Expliquer ce qu’est un tableau NumPy et en quoi il diffère d’une liste
NumPy stocke les données numériques dans des tableaux afin qu’une seule expression puisse agir sur de nombreuses valeurs. Importe-le avec import numpy as np ; le nom court np est la façon habituelle d’appeler ses fonctions.
Lire la structure d’un tableau
Un ndarray est une grille rectangulaire dont les éléments partagent un même type de données. Une dimension est aussi appelée axe. Partons d’une petite table :
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
Ses attributs répondent à quatre questions différentes :
| Attribut | Signification | Valeur pour a |
|---|---|---|
ndim | Nombre d’axes | 2 |
shape | Longueur de chaque axe | (2, 3) |
size | Nombre total d’éléments | 6 |
dtype | Type de chaque élément | Généralement int64 sur un ordinateur 64 bits |
L’axe 0 indexe les lignes ; l’axe 1 indexe les colonnes. Une table de données comportant une ligne par personne et des colonnes pour la taille, la masse et l’âge aurait pour forme (100, 3) pour 100 personnes. Le produit des éléments de la forme donne la taille du tableau.
Un vecteur n’a pas d’axe de lignes ou de colonnes
np.array([2, 4, 6, 8]) a pour forme (4,) et possède un axe. La virgule en fait un tuple à un élément. La forme (1, 4) a deux axes : une ligne et quatre colonnes. La forme (4, 1) a aussi deux axes, mais quatre lignes et une colonne. Ces tableaux contiennent quatre valeurs, mais se comportent différemment lorsqu’ils sont combinés à d’autres tableaux. np.array(7) est un tableau à zéro dimension : sa forme est () et son ndim vaut 0.
Les tableaux changent le sens des opérateurs
Une liste est un conteneur Python généraliste. Un tableau est conçu pour les calculs sur les positions correspondantes.
| Expression | Résultat |
|---|---|
[1, 2, 3] * 2 | [1, 2, 3, 1, 2, 3] |
np.array([1, 2, 3]) * 2 | array([2, 4, 6]) |
[1, 2] + [3, 4] | [1, 2, 3, 4] |
np.array([1, 2]) + np.array([3, 4]) | array([4, 6]) |
Dans l’addition de tableaux, 1 est associé à 3 et 2 à 4. Le tableau conserve la même taille.
Pourquoi les tableaux numériques sont efficaces
Un tableau numérique nouvellement créé stocke ensemble en mémoire des valeurs de même type. NumPy parcourt ces valeurs dans du code compilé, ce qui évite une opération distincte au niveau de Python pour chaque nombre. Un million de valeurs float64 occupent 8 000 000 octets pour le stockage des éléments, valeur accessible par a.nbytes sur un tableau de cette taille. Une liste Python stocke aussi des références vers des objets Python : elle nécessite donc beaucoup plus d’espace. Les gains de performance dépendent du calcul et de l’ordinateur.
La taille d’un tableau ne s’accroît pas par une méthode append en place. np.append(a, value) alloue un nouveau tableau. Pour des données recueillies une valeur à la fois, construis une liste Python et convertis-la une seule fois. Les données imbriquées fournies doivent former un rectangle : np.array([[1, 2], [3]]) déclenche ValueError car les longueurs de ses lignes diffèrent.
Reconnaître les résultats affichés
print(np.array([1, 2, 3])) affiche [1 2 3]. Un affichage interactif utilise array([1, 2, 3]). Pour np.array([5, 6])[0] sur un ordinateur 64 bits, NumPy 2 affiche np.int64(5) ; cette valeur participe aux calculs comme le nombre 5.
Points clés
- La forme donne la longueur de chaque axe ; la taille compte tous les éléments.
- Une forme à 1 dimension comme
(4,)diffère d’une ligne ou d’une colonne à 2 dimensions. - Les calculs sur les tableaux agissent sur les valeurs situées aux positions correspondantes.
- Les tableaux numériques stockent un seul type de données et permettent des calculs compilés efficaces.
- Les données imbriquées fournies doivent comporter des lignes de même longueur.
1.2 Créer des tableaux à partir de listes et avec les fonctions de création de NumPy
Choisis une fonction de création en te demandant ce que tu connais : les valeurs elles-mêmes, une forme et une valeur de remplissage, un pas ou un nombre de points requis. Ce choix permet au code d’exprimer comment les données doivent être construites.
Partir de valeurs ou d’une forme
np.array([3, 1, 4]) crée un vecteur. Une liste de listes de même longueur crée une table. Passe les valeurs sous forme d’une seule séquence ; np.array(1, 2, 3) ne fournit pas correctement trois éléments.
| Fonction | Exemple | Résultat créé |
|---|---|---|
np.zeros | np.zeros((3, 4)) | Trois lignes de quatre zéros |
np.ones | np.ones((2, 3)) | Deux lignes de trois uns |
np.full | np.full((2, 2), 7) | Un tableau de 2 lignes et 2 colonnes rempli de 7 |
np.empty | np.empty((3, 4)) | Un espace de stockage réservé et non initialisé |
Pour une forme à plusieurs dimensions, les parenthèses comptent. np.zeros((2, 3)) passe un seul tuple. Dans np.zeros(2, 3), Python transmet 3 comme argument de type de données, ce qui provoque une erreur de type. Les zéros et les uns sont de type float64 par défaut ; full infère son type de données à partir de la valeur de remplissage. Ajoute dtype=int lorsque tu dois stocker des nombres entiers.
empty ne garantit ni des zéros ni des valeurs initiales ayant un sens. Ne lis un élément qu’après lui avoir affecté une valeur, pour chaque élément que tu vas utiliser. zeros est un choix plus simple lorsqu’une valeur initiale de zéro a un sens.
Choisir un pas ou un nombre de points
np.arange(start, stop, step) suit le principe de progression de range en Python. np.arange(2, 11, 3) donne [2 5 8] : on part de 2 et on ajoute 3 en restant en dessous de 11. Avec un seul argument, np.arange(5) part de 0 et donne [0 1 2 3 4].
Les pas en virgule flottante peuvent produire des bornes inattendues. Par exemple, np.arange(1, 1.3, 0.1) inclut la valeur affichée 1.3 car l’arrondi binaire influence le calcul de la suite. Pour une grille décimale avec un nombre fixe de points, utilise linspace :
grid = np.linspace(0, 1, 5)
# array([0. , 0.25, 0.5 , 0.75, 1. ])
Les deux bornes sont incluses par défaut. Cinq points forment quatre intervalles. Dix points entre 0 et 1 forment neuf intervalles : leur espacement est donc d’environ 0,111 ; des pas de 0,1 nécessitent 11 points.
Réutiliser une structure existante
np.zeros_like(a), np.ones_like(a) et np.full_like(a, value) créent de nouveaux tableaux avec la forme et le type de données de a. Le type hérité compte : remplir un modèle entier avec un décimal peut faire perdre la partie décimale, sauf si tu demandes un type à virgule flottante. np.eye(3) crée une matrice identité carrée avec des uns sur la diagonale et des zéros ailleurs.
Allouer une table de données une seule fois
Pour des précipitations en millimètres à trois stations sur quatre semaines :
rain = np.zeros((3, 4))
rain[0] = [12.0, 0.0, 5.5, 8.0]
La première affectation remplit une ligne et conserve la forme (3, 4). Si le nombre de mesures est connu, réserver la table entière évite d’allouer à répétition des tableaux plus grands. Si la quantité de données fournies est inconnue, accumule les valeurs dans une liste et appelle np.array une fois la collecte terminée.
Points clés
- Passe une forme à plusieurs dimensions sous forme de tuple.
arangeindique un pas ;linspaceindique un nombre de points.linspaceinclut les deux bornes par défaut.emptydoit être rempli avant l’utilisation de ses valeurs.- Les fonctions like héritent à la fois de la forme et du type de données.
- Alloue une seule fois un tableau dont la forme finale est connue.
1.3 Choisir, examiner et convertir les types de données
Le type de données d’un tableau détermine ce qu’il peut stocker et la mémoire nécessaire à chaque valeur. Choisir le bon type évite aussi que les calculs perdent des informations sans avertissement.
Examiner le type de stockage
int64 contient des entiers sur 64 bits, float64 des nombres binaires à virgule flottante et bool des valeurs vrai ou faux. Les types Unicode tels que <U5 stockent du texte avec une longueur maximale en caractères. a.itemsize est le nombre d’octets par élément ; a.nbytes vaut a.size * a.itemsize. Un float64 utilise 8 octets et offre une précision d’environ 15 chiffres décimaux significatifs.
Sur les ordinateurs 64 bits classiques, les entiers fournis sont stockés sur 64 bits. NumPy 2 utilise aussi cette valeur par défaut sur Windows 64 bits. Des décimaux fournis donnent normalement le type float64.
L’inférence choisit un seul type partagé
np.array([1, 2.5]) devient [1. 2.5] : l’entier est représenté comme un nombre à virgule flottante. np.array([True, 2]) devient [1 2]. Mélanger nombres et texte peut transformer tout le tableau en texte, de sorte qu’une étiquette comme 'n/a' peut faire échouer les calculs ultérieurs. Examine dtype lorsque des données apparemment numériques ne peuvent pas être additionnées ou multipliées.
Convertir en connaissance de cause
astype renvoie une copie convertie :
x = np.array([1.7, -1.7, 2.5])
whole = x.astype(int)
# array([ 1, -1, 2])
Cette conversion tronque vers zéro ; elle n’arrondit pas. np.round(x).astype(int) donne [2 -2 2] car les valeurs exactement à mi-chemin sont arrondies vers la valeur paire la plus proche. Un texte comme '1.5' se convertit avec astype(float), mais 'n/a' déclenche ValueError. Nettoie les codes de valeur manquante avant la conversion.
Les affectations utilisent le type de données de destination. Après a = np.array([1, 2, 3]), l’affectation a[0] = 9.9 stocke 9 sans avertissement. Convertir d’abord tout le tableau en nombres à virgule flottante permet aux affectations ultérieures de conserver les décimales.
Les entiers de taille fixe peuvent dépasser leur capacité
Un int8 contient les valeurs de −128 à 127 ; un uint8 contient celles de 0 à 255. Additionner deux tableaux uint8 contenant 250 et 10 produit 4 par bouclage. Multiplier par 2 un tableau int8 contenant 100 produit −56. Un entier Python qui ne peut pas être représenté par le type du tableau, comme 300 ajouté à un tableau int8 dans NumPy 2, déclenche en revanche OverflowError. Passe les petits types entiers à des types plus larges avant des calculs susceptibles de dépasser leur plage.
Division et décimaux approximatifs
| Opération | Exemple | Résultat |
|---|---|---|
| Division | np.array([7, 8]) / 2 | [3.5 4.] |
| Division entière arrondie vers le bas | np.array([7, -7]) // 2 | [3 -4] |
| Reste | np.array([7, -7]) % 2 | [1 1] |
La division entière arrondit vers l’infini négatif, ce qui diffère de la troncature pour les résultats négatifs. La division ordinaire renvoie des résultats à virgule flottante pour des entiers en entrée.
De nombreuses fractions décimales sont approximatives en binaire. 0.1 + 0.2 == 0.3 est faux ; np.isclose compare les valeurs correspondantes avec une tolérance, et np.allclose donne une réponse unique pour les tableaux entiers.
Le marqueur de valeur manquante np.nan est un nombre à virgule flottante. Les tableaux d’entiers ne peuvent pas le stocker. np.array([1, 2, np.nan]) devient donc un tableau à virgule flottante ; convertir les valeurs manquantes en entiers ne les corrige pas et peut produire des résultats sans signification.
Points clés
- Un seul type de données régit tous les éléments, y compris les valeurs affectées ultérieurement.
astype(int)tronque vers zéro ; l’arrondi est une étape distincte.- Les petits entiers de taille fixe peuvent dépasser leur capacité pendant les calculs.
- Utilise des comparaisons avec une tolérance pour les décimaux approximatifs.
- NaN nécessite un type de données à virgule flottante.
2Sélectionner et filtrer les données dans des tableaux
Une analyse nécessite rarement toutes les valeurs exactement dans leur ordre d’origine. Sélectionne des positions individuelles, des tranches régulières, des enregistrements quelconques ou des éléments qui remplissent une condition. Vérifie si un résultat partage sa mémoire avec sa source avant de le modifier. Les masques booléens permettent ensuite d’utiliser une même règle de sélection pour filtrer, remplacer, compter et calculer des proportions, tout en conservant les enregistrements complets lorsque ta question l’exige.
2.1 Indexer des tableaux à une ou deux dimensions et en extraire des tranches
L’indexation repère les valeurs par leur position. L’extraction de tranches sélectionne une suite régulière de positions. Dans une table, écris un sélecteur pour chaque axe afin que le code indique les lignes et les colonnes dont tu as besoin.
Lire un vecteur
Pour a = np.array([10, 20, 30, 40, 50]), la position 0 contient 10 et la position −1 contient 50. Une tranche a la forme start:stop:step, avec la borne de fin exclue :
| Sélection | Résultat |
|---|---|
a[1:4] | [20 30 40] |
a[::2] | [10 30 50] |
a[::-1] | [50 40 30 20 10] |
a[3:10] | [40 50] |
Omettre le début ou la fin étend la tranche jusqu’à l’extrémité correspondante. Une tranche peut dépasser le tableau et être raccourcie automatiquement. Une position isolée invalide, comme a[5], déclenche IndexError.
Donner à chaque axe de la table son propre sélecteur
m = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
m[1, 2] lit la ligne 1, colonne 2, et donne 6. La virgule sépare les axes. Un deux-points seul sélectionne l’axe entier : m[0, :] donne la première ligne [1 2 3], et m[:, 1] donne la deuxième colonne [2 5 8]. Pour un bloc, m[:2, 1:] sélectionne les lignes 0 et 1 et les colonnes 1 et 2, ce qui donne [[2 3] [5 6]].
Ne considère pas l’indexation par crochets successifs comme interchangeable avec l’indexation par virgule. m[1][2] trouve ici le même scalaire que m[1, 2]. Mais m[:][0] prend d’abord toutes les lignes, puis sélectionne la première ligne. Il ne sélectionne pas la première colonne, qui est m[:, 0].
Prévoir les axes qui restent
Un sélecteur entier unique supprime son axe. Une tranche conserve son axe même lorsqu’une seule position est sélectionnée. Ainsi, m[:, 1] a pour forme (3,), tandis que m[:, 1:2] a pour forme (3, 1). Les deux sélectionnent 2, 5 et 8, mais seul le second conserve un axe de colonne. Cette différence devient importante lorsqu’on soustrait ou multiplie des tableaux de formes différentes.
La même règle s’étend au-delà des tables. Si t.shape vaut (2, 3, 4), t[0] a pour forme (3, 4), t[0, 1] a pour forme (4,) et t[:, :, 0] a pour forme (2, 3). Les axes de fin omis dans l’indexation sont sélectionnés en entier.
Modifier les positions sélectionnées
Une affectation par indexation écrit dans le tableau existant. a[1:3] = 0 remplace les deux valeurs sélectionnées par zéro ; le scalaire est appliqué à toute la sélection. m[0] = [0, 0, 0] remplace une ligne complète. Les valeurs affectées doivent convenir à la forme de la sélection et sont converties à son type de données.
Pour quatre élèves et trois tests :
scores = np.array([[78, 85, 92], [64, 70, 58],
[88, 91, 95], [72, 68, 80]])
scores[2] correspond aux résultats du troisième élève [88 91 95]. scores[:, -1] donne les résultats du dernier test [92 58 95 80]. scores[1:3, :2] donne [[64 70] [88 91]] : deux élèves, chacun conservant deux colonnes de tests.
Points clés
- Les indices commencent à 0 ; les indices négatifs comptent à partir de la fin.
- Les tranches excluent la borne de fin et peuvent être raccourcies à la limite d’un tableau.
- Utilise des sélecteurs séparés par des virgules pour les différents axes.
- Un entier supprime un axe ; une tranche le conserve.
- Une affectation par indexation modifie les valeurs sélectionnées.
2.2 Sélectionner des éléments à partir de listes de positions et distinguer les vues des copies
Une sélection peut partager ses données avec le tableau d’origine ou posséder des données indépendantes. Savoir dans quel cas tu te trouves évite que la modification d’une petite sélection change une table plus grande de façon inattendue.
Distinguer un alias, une vue et une copie
| Code | Relation | Effet d’une modification de b |
|---|---|---|
b = a | Deux noms pour un même objet | Modifie a |
b = a[2:5] | Vue issue d’une tranche qui partage les données | Modifie la partie correspondante de a |
b = a[2:5].copy() | Données indépendantes | Laisse a inchangé |
Pour a = np.arange(6) et b = a[2:5], l’affectation b[0] = 99 donne à a la valeur [0 1 99 3 4 5]. La première position de la vue correspond à la position 2 dans l’original. Cela diffère de l’extraction d’une tranche d’une liste Python, qui crée une nouvelle liste.
Copie avant de modifier lorsque l’original doit rester intact. Une petite vue conservée peut aussi maintenir en mémoire le grand tampon de données d’origine ; copier ce petit morceau lui permet d’être indépendant.
Sélectionner des positions quelconques
L’indexation avancée utilise une liste ou un tableau d’entiers. Elle permet de changer l’ordre des positions et de les répéter :
a = np.array([10, 20, 30, 40, 50])
a[[4, 0, 0]]
# array([50, 10, 10])
Pour m = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), m[[0, 2]] sélectionne les première et troisième lignes. m[:, [2, 0]] sélectionne les dernière et première colonnes dans cet ordre, ce qui donne [[3 1] [6 4] [9 7]].
Deux listes d’entiers dans une même indexation sélectionnent des coordonnées appariées. m[[0, 2], [1, 2]] associe la ligne 0 à la colonne 1 et la ligne 2 à la colonne 2, ce qui produit [2 9]. Cette opération ne prend pas toutes les combinaisons. Pour obtenir le bloc formé par les deux lignes et les deux colonnes, utilise :
m[np.ix_([0, 2], [1, 2])]
# array([[2, 3], [8, 9]])
Sélectionner d’abord les lignes puis les colonnes avec m[[0, 2]][:, [1, 2]] donne le même bloc.
La lecture et l’affectation se comportent différemment
L’indexation avancée et le filtrage booléen renvoient des copies. Si c = a[[0, 1]], modifier c[0] laisse a inchangé. Mais a[[0, 1]] = -1 écrit directement dans ces positions du tableau d’origine. Une sélection enregistrée et une affectation par indexation sont des opérations différentes.
Cela explique aussi pourquoi des modifications chaînées peuvent ne pas atteindre la source. Dans a[[0, 1]][0] = -1, la première sélection est déjà une copie temporaire. L’écriture finale modifie ce tableau temporaire, et non a.
Vérifier directement le partage
np.shares_memory(x, y) vérifie si deux tableaux occupent une partie commune de la mémoire. Elle renvoie vrai pour une tranche ordinaire non vide et faux pour une copie issue d’une indexation avancée. L’attribut base peut identifier le tableau propriétaire de la mémoire, mais il ne désigne pas nécessairement le dernier tableau dont tu as extrait une tranche. Si a = np.arange(6), b = a[2:5] et c = b[0:2], alors c.base is a est vrai et c.base is b est faux. Utilise shares_memory pour vérifier précisément si deux tableaux partagent des données.
Points clés
- Une affectation crée un alias du tableau ; une tranche simple partage ses données.
- Utilise
.copy()pour obtenir une sélection indépendante. - L’indexation avancée conserve l’ordre demandé et autorise les répétitions.
- Deux listes d’indices entiers apparient les coordonnées ;
np.ix_sélectionne toutes les combinaisons. - Une lecture par indexation avancée crée une copie, mais une affectation directe par indexation modifie la source.
- Utilise
np.shares_memorypour vérifier le partage entre tableaux.
2.3 Filtrer selon des conditions avec des masques booléens et np.where
Un masque booléen indique quelles valeurs remplissent une condition. Une fois le masque créé, les mêmes valeurs vrai ou faux peuvent servir à sélectionner des valeurs, compter des événements ou choisir des valeurs de remplacement.
Construire et appliquer un masque
t = np.array([18.5, 22.0, 15.2, 25.8, 21.1])
warm = t > 20
t[warm]
# array([22. , 25.8, 21.1])
La comparaison produit [False True False True True]. L’indexation booléenne conserve les positions où le masque est vrai et renvoie une copie. Un masque à 1 dimension utilisé sur un axe doit avoir la même longueur que cet axe.
Pour combiner des conditions, utilise & pour ET, | pour OU et ~ pour NON. Place chaque comparaison entre parenthèses :
comfortable = (t > 18) & (t < 23)
t[comfortable]
# array([18.5, 22. , 21.1])
Les opérateurs Python and et or cherchent à obtenir une seule valeur de vérité pour un tableau entier et échouent avec les tableaux de plusieurs éléments. Omettre les parenthèses change aussi la manière dont Python regroupe l’expression, car les opérateurs bit à bit sont prioritaires sur les comparaisons.
Compter, mesurer ou tester des conditions
True contribue pour 1 et False pour 0. warm.sum() vaut 3 et warm.mean() vaut 0,6, la proportion de jours au-dessus de 20 °C. np.count_nonzero(warm) compte aussi les éléments vrais. warm.any() vérifie si au moins un jour est chaud ; warm.all() vérifie si tous les jours sont chauds.
Ces opérations répondent à des questions différentes de t[warm].mean(), qui calcule la température moyenne parmi les jours chauds. La moyenne d’un masque mesure une proportion ; la moyenne des mesures sélectionnées conserve l’unité de mesure.
Remplacer des valeurs ou choisir entre deux possibilités
Une affectation à travers un masque met à jour les positions sélectionnées. Avec t2 = t.copy(), la ligne t2[t2 < 16] = 16 porte les mesures basses à 16. np.clip(t, 16, 25) renvoie un nouveau tableau borné aux deux extrémités, [18.5 22. 16. 25. 21.1].
np.where(condition, x, y) construit un nouveau résultat en prenant x aux positions vraies et y aux positions fausses. np.where(t > 20, 'warm', 'cool') fournit une étiquette à chaque position d’origine. Le filtrage, lui, raccourcit le résultat. Avec une condition seule, np.where(t > 20) renvoie un tuple de tableaux d’indices, ici (array([1, 3, 4]),).
Conserver des valeurs ou des enregistrements complets
Un masque de même forme appliqué à un tableau à 2 dimensions extrait les éléments correspondants dans un seul vecteur aplati. Dans m[m > 5], la structure des lignes est perdue. Pour conserver des enregistrements entiers, déduis une valeur booléenne par ligne à partir d’une colonne :
scores = np.array([[78, 85, 92], [64, 70, 58],
[88, 91, 95], [72, 68, 80]])
scores[scores[:, 2] >= 90]
# array([[78, 85, 92], [88, 91, 95]])
Repérer explicitement les valeurs manquantes
NaN n’est même pas égal à lui-même. Les comparaisons d’égalité et d’ordre avec NaN sont fausses ; l’inégalité est vraie. Ainsi, ni x == np.nan ni x != np.nan ne repère correctement les éléments présents et manquants. np.isnan(x) indique les positions manquantes, et x[~np.isnan(x)] conserve les valeurs présentes.
Points clés
- Un masque contient une valeur vrai ou faux par position testée.
- Combine les comparaisons mises entre parenthèses avec
&,|et~. - La somme d’un masque compte les correspondances ; sa moyenne donne leur proportion.
- Utilise un masque comportant un élément par ligne pour filtrer des enregistrements entiers.
np.wherechoisit des valeurs à chaque position.- Utilise
np.isnanpour repérer les NaN.
3Remodeler, transposer et assembler des tableaux
Une forme de tableau utile exprime la façon dont les données sont regroupées : des mois dans des trimestres, des mesures dans des enregistrements ou des lots dans un ensemble plus vaste. Réorganise les valeurs par remodelage, permute les rôles des axes par transposition et ajoute des axes de longueur un lorsqu’un vecteur doit jouer le rôle d’une ligne ou d’une colonne. L’assemblage et le découpage permettent ensuite de combiner ou de séparer ces groupes, en vérifiant les formes pour préserver la structure voulue.
3.1 Modifier la forme d’un tableau et permuter ses axes
Modifier la forme change la manière dont les valeurs sont regroupées selon les axes. Remodeler, transposer et ajouter un axe sont des opérations différentes, même si certaines produisent la même forme finale.
Remodeler sans changer le nombre d’éléments
a = np.arange(6)
r = a.reshape(2, 3)
# array([[0, 1, 2], [3, 4, 5]])
L’ordre par défaut remplit une ligne à la fois : le dernier axe varie le plus vite. Remodeler les mêmes valeurs selon la forme (3, 2) donne [[0 1] [2 3] [4 5]]. Le produit des nouvelles dimensions doit être égal à la taille d’origine. Douze éléments conviennent à la forme (3, 4), mais pas à (5, 3).
Une dimension peut être indiquée par -1, ce qui laisse NumPy en déduire la longueur. np.arange(12).reshape(-1, 3) donne quatre lignes de trois éléments ; reshape(2, -1) donne deux lignes de six éléments. Deux dimensions inconnues ne sont pas autorisées, car leurs longueurs respectives ne peuvent pas être déduites du seul total.
La transposition permute les axes
Pour r ci-dessus, r.T vaut [[0 3] [1 4] [2 5]] et a pour forme (3, 2). Chaque ancienne colonne est désormais une ligne. Cette disposition diffère de celle de r.reshape(3, 2), même si les formes obtenues sont identiques.
| Opération | Effet sur r |
|---|---|
r.reshape(3, 2) | Lit les valeurs ligne par ligne et les regroupe |
r.T | Permute les rôles des lignes et des colonnes |
Une transposition est utile lorsque l’opération suivante nécessite l’ordre inverse des axes. Un remodelage est utile lorsqu’une séquence possède déjà un regroupement qui a un sens, comme des mois regroupés en trimestres.
Transposer un tableau à 1 dimension ne crée pas une colonne
v = np.arange(3) n’a qu’un seul axe, donc v.T a toujours pour forme (3,). Ajoute explicitement un axe :
column = v[:, np.newaxis] # shape (3, 1)
row = v[np.newaxis, :] # shape (1, 3)
v.reshape(-1, 1) et np.expand_dims(v, 1) créent aussi une colonne. np.squeeze(column) supprime son axe de longueur un et renvoie un tableau de forme (3,). Ajouter un axe ne change aucune valeur, mais indique aux calculs ultérieurs comment les aligner.
Aplatissement et partage de mémoire
r.ravel() et r.flatten() énumèrent tous deux les valeurs dans un résultat à 1 dimension. ravel renvoie une vue lorsque c’est possible ; flatten crée toujours une copie. reshape(-1) est une autre façon de demander une disposition à 1 dimension, mais le partage de mémoire dépend de l’organisation des données en entrée. Le remodelage peut nécessiter une copie ; la transposition partage les données dans la vue du tableau qu’elle renvoie. Utilise .copy() lorsqu’un stockage indépendant est nécessaire.
Regrouper les valeurs mensuelles par trimestre
Pour monthly = np.array([120, 135, 150, 160, 155, 170, 180, 175, 165, 150, 140, 130]), monthly.reshape(4, 3) crée quatre lignes de trimestres, chacune contenant trois mois. Additionner chaque ligne avec .sum(axis=1) donne [405 485 520 420]. Le premier total est 120 + 135 + 150 = 405. Le remodelage fonctionne parce que les données fournies dans l’ordre chronologique regroupent déjà les mois de chaque trimestre.
Points clés
- Le remodelage conserve le nombre d’éléments et suit par défaut l’ordre par lignes.
- La longueur d’une dimension indiquée par
-1peut être déduite. - La transposition permute les rôles des axes et peut différer d’un remodelage donnant la même forme.
- Utilise un nouvel axe pour transformer un vecteur en ligne ou en colonne.
flattencopie les données ;ravelet le remodelage peuvent les partager.
3.2 Assembler et découper des tableaux
L’assemblage combine les valeurs de plusieurs tableaux. Le découpage divise un tableau en morceaux. Détermine d’abord si l’opération doit prolonger un axe existant ou en créer un nouveau.
Concaténer selon un axe existant
np.concatenate([a, b], axis=0) assemble des vecteurs bout à bout. Assembler [1 2] avec [3 4 5] donne [1 2 3 4 5].
Pour deux tableaux ayant chacun la forme (2, 3), l’axe 0 ajoute des lignes et donne (4, 3). L’axe 1 ajoute des colonnes et donne (2, 6). Seul l’axe d’assemblage peut avoir des longueurs différentes. Ainsi, les formes (2, 3) et (2, 2) peuvent être assemblées selon l’axe 1 pour former (2, 5), mais pas selon l’axe 0, car leurs nombres de colonnes diffèrent.
Les tableaux doivent être passés ensemble sous forme de séquence, par exemple [a, b]. L’assemblage crée un nouveau tableau combiné et copie les données des tableaux fournis.
Empiler selon un nouvel axe
Pour p = np.array([1, 2, 3]) et q = np.array([4, 5, 6]) :
| Expression | Forme | Disposition |
|---|---|---|
np.concatenate([p, q]) | (6,) | Un vecteur plus long |
np.stack([p, q]) | (2, 3) | Un vecteur par ligne |
np.stack([p, q], axis=1) | (3, 2) | Un vecteur par colonne |
stack exige des tableaux de même forme en entrée et ajoute un axe. concatenate conserve le nombre d’axes. Les fonctions utilitaires expriment des dispositions courantes : vstack([p, q]) crée des lignes, hstack([p, q]) assemble ces tableaux à 1 dimension bout à bout et column_stack([p, q]) crée des colonnes. Le comportement de hstack avec des tableaux à 1 dimension explique pourquoi son seul nom ne suffit pas à prévoir la table obtenue.
Découper selon des bornes ou un nombre de parties
np.split(np.arange(10), [3, 7]) découpe avant les positions 3 et 7, ce qui donne [0 1 2], [3 4 5 6] et [7 8 9]. Les positions de découpage ne sont pas des longueurs de parties.
Un entier comme deuxième argument demande au contraire des parties égales : np.split(x, 3) demande trois morceaux égaux. Dix éléments ne peuvent pas être divisés également en trois morceaux de longueur entière : cela déclenche donc ValueError. np.array_split(np.arange(10), 3) autorise des longueurs inégales et produit 4, 3 et 3. Ces appels de découpage renvoient une collection de tableaux, et non un seul tableau avec un nouvel axe d’empilement.
Construire une table de mesures
h = np.array([1.62, 1.75, 1.80]) # meters
w = np.array([55.0, 72.5, 80.0]) # kilograms
data = np.column_stack([h, w])
La forme (3, 2) correspond à trois personnes, avec la taille et la masse en colonnes. L’expression data[:, 1] / data[:, 0] ** 2 calcule la masse divisée par la taille au carré pour chaque ligne, ce qui donne environ 21,0, 23,7 et 24,7 kg/m². Il est essentiel que les deux tableaux de mesures suivent le même ordre de personnes.
Si les données arrivent par lots, rassemble les tableaux des lots dans une liste Python et appelle concatenate une seule fois. Réassembler un tableau qui grandit à chaque passage dans une boucle copie ses données existantes à répétition.
Points clés
- La concaténation prolonge un axe ; l’empilement en ajoute un.
- Pour une concaténation, les dimensions autres que celle de l’assemblage doivent correspondre.
- Utilise
column_stackpour transformer des vecteurs correspondants en colonnes d’une table. - Les positions de découpage sont des bornes ; un nombre entier de parties demande des morceaux égaux.
array_splitautorise des morceaux de longueurs inégales.- Rassemble d’abord les lots, puis assemble-les en une seule fois.
4Remplacer les boucles par des calculs vectorisés, des fonctions universelles et la diffusion
Les expressions portant sur des tableaux entiers permettent de décrire des calculs numériques sans écrire une boucle Python pour chaque valeur. Commence par les calculs sur les positions correspondantes, puis applique les fonctions mathématiques de NumPy et combine des formes différentes par diffusion. La lecture des formes permet de comprendre quelles valeurs sont appariées et lesquelles sont répétées. Les règles de conversion de type, les entrées invalides et les avertissements de division comptent aussi lorsqu’une courte expression effectue de nombreux calculs à la fois.
4.1 Calculer élément par élément sans boucle explicite
La vectorisation exprime un calcul pour des tableaux entiers. NumPy effectue le travail répété sur chaque élément dans du code compilé, de sorte que l’expression Python peut rester proche du calcul recherché.
Traduire une boucle en calcul sur les positions correspondantes
prices = np.array([2.50, 4.00, 1.20])
qty = np.array([3, 1, 5])
line_totals = prices * qty
order_total = line_totals.sum()
Les produits sont [7.5 4. 6.] et leur somme est de 17,5. Chaque prix est associé à sa quantité. Une boucle Python qui met à jour un total produit le même résultat, mais demande à Python de traiter chaque paire séparément.
Tous les opérateurs arithmétiques agissent élément par élément : +, -, *, /, //, % et **. Un scalaire s’applique à chaque élément. 10 - np.array([1, 2, 3]) donne [9 8 7] ; l’ordre des opérandes reste important. Deux tableaux doivent avoir des formes égales ou compatibles avec la diffusion.
Distinguer le produit élément par élément du produit matriciel
* multiplie les éléments correspondants. Pour A = np.array([[1, 2], [3, 4]]) et B = np.array([[5, 6], [7, 8]]), A * B donne [[5 12] [21 32]]. La multiplication matricielle utilise @ et donnerait [[19 22] [43 50]]. Choisis * pour des mesures appariées comme un prix et une quantité.
Les comparaisons renvoient aussi une réponse par position
a == b produit un tableau booléen. Il ne vérifie pas si les deux tableaux sont égaux en tant qu’objets entiers. Une instruction if nécessite une seule valeur de vérité : if a == b: échoue donc pour des résultats à plusieurs éléments. np.array_equal(a, b) teste l’égalité exacte des tableaux entiers. Pour les décimaux approximatifs, np.allclose(a, b) vérifie leur correspondance à une tolérance près.
Comprendre les avertissements de division
Avec les réglages d’erreur par défaut de NumPy, une division en virgule flottante par zéro produit un avertissement et des valeurs spéciales :
np.array([1.0, -1.0, 0.0]) / 0
# array([ inf, -inf, nan])
np.isfinite repère les résultats qui ne sont ni infinis ni NaN. La division entière par zéro arrondie vers le bas renvoie, elle, des zéros entiers avec un avertissement. Ces zéros paraissent finis : examine donc les dénominateurs entiers avec (d == 0).any() avant une division entière arrondie vers le bas. Un avertissement mérite ton attention même si le programme continue.
Décider de modifier ou non en place
a += value modifie le stockage existant et conserve son type de données. Si a est un tableau d’entiers, a += 0.5 déclenche une erreur de conversion de type, car le résultat à virgule flottante ne peut pas être stocké selon la règle de conversion de cette opération. a = a + 0.5 crée un résultat à virgule flottante et associe a à ce résultat. Cela diffère de l’affectation d’un décimal à un élément entier, qui peut le tronquer sans avertissement.
Construire une expression en plusieurs étapes
Pour old = np.array([2.50, 4.00, 8.00]) et new = np.array([3.00, 3.00, 8.00]), (new - old) / old * 100 donne [20. -25. 0.]. Calcule d’abord chaque variation, puis divise-la par sa valeur d’origine, puis exprime le rapport en pourcentage. Les signes indiquent une hausse, une baisse et une absence de variation. Les valeurs d’origine doivent être non nulles pour ce calcul de pourcentage.
Points clés
- Les opérateurs vectorisés calculent sur des tableaux entiers, élément par élément.
*associe les éléments correspondants ;@effectue un produit matriciel.- Pour comparer des tableaux entiers, utilise une fonction qui renvoie un résultat unique.
- Vérifie les dénominateurs et examine les avertissements de division.
- Un calcul en place conserve le type de données de destination.
4.2 Appliquer des fonctions universelles à des tableaux entiers
Une fonction universelle, ou ufunc, applique un calcul séparément à chaque position d’un tableau. Ces fonctions étendent la vectorisation au-delà des calculs arithmétiques ordinaires : racines, logarithmes, arrondis, comparaisons et autres opérations numériques.
Choisir une fonction adaptée aux tableaux
Les fonctions universelles unaires prennent une entrée. np.sqrt(np.array([1, 4, 9])) donne [1. 2. 3.], et np.abs(np.array([-2, 3])) donne [2 3]. np.exp est la fonction exponentielle, np.log est le logarithme népérien et np.log10 est le logarithme en base 10. Par exemple, np.exp(0) vaut 1,0 et np.log10(1000) vaut 3,0.
Le module Python math travaille sur des nombres individuels. math.sqrt(np.array([1, 4])) ne peut pas calculer les deux racines et déclenche une erreur de type. Utilise la version de NumPy pour les tableaux numériques. Les opérateurs appellent aussi des fonctions universelles : a + b correspond à np.add(a, b) et a * b à np.multiply(a, b).
Comparer les valeurs correspondantes ou réduire un tableau entier
Les fonctions universelles binaires prennent deux entrées. np.maximum([1, 5, 3], [4, 2, 6]) donne [4 5 6], en choisissant la plus grande valeur à chaque position. np.minimum choisit la plus petite et np.power élève les bases correspondantes aux puissances indiquées.
np.maximum(x, 0) fixe les éléments négatifs à zéro dans un nouveau résultat. Cette fonction diffère de np.max(x), une agrégation qui renvoie une seule valeur maximale. Pour [1, 5, 3], max donne 5 ; maximum nécessite une autre entrée et conserve la structure élément par élément.
Arrondir selon la règle voulue
| Fonction | Règle | Résultat pour −2,5 |
|---|---|---|
np.floor | Vers l’infini négatif | −3,0 |
np.ceil | Vers l’infini positif | −2,0 |
np.trunc | Vers zéro | −2,0 |
np.round | Au plus proche ; les valeurs à mi-chemin vers le pair | −2,0 |
np.round(x, 2) conserve deux décimales. Les valeurs exactement à mi-chemin suivent la règle du nombre pair : np.round([0.5, 1.5, 2.5]) donne [0. 2. 2.]. L’approximation binaire peut influencer les valeurs qui semblent à mi-chemin en décimal : interprète donc les décimaux affichés en tenant compte de leur représentation en virgule flottante.
Examiner les valeurs hors de l’ensemble de définition d’une fonction
Pour des entrées réelles à virgule flottante, np.sqrt(-1.0) renvoie NaN avec un avertissement, tandis que np.log(0.0) renvoie l’infini négatif avec un avertissement lorsque les réglages d’erreur sont ceux par défaut. Contrairement à math.sqrt(-1), ces appels ne s’arrêtent normalement pas sur une exception de domaine. Vérifie les entrées lorsque l’opération mathématique exige une plage limitée. np.isnan repère les NaN ; np.isfinite repère les valeurs qui ne sont ni NaN ni infinies ; np.isclose compare les valeurs avec une tolérance.
Combiner des fonctions universelles dans un calcul utile
Pour les tableaux de coordonnées x = np.array([3, 5, 8]) et y = np.array([4, 12, 15]), calcule la distance à l’origine avec np.sqrt(x ** 2 + y ** 2). L’élévation au carré donne [9 25 64] et [16 144 225] ; l’addition donne [25 169 289] ; les racines sont [5. 13. 17.]. np.hypot(x, y) calcule directement ces distances.
Points clés
- Les fonctions universelles effectuent des opérations numériques à chaque position.
- Utilise les fonctions NumPy pour les tableaux, notamment pour les racines et les logarithmes.
maximumcompare les positions ;maxréduit les valeurs.- La partie entière inférieure, la partie entière supérieure, la troncature et l’arrondi suivent des règles différentes.
- Examine les NaN et les infinis après des opérations invalides sur les nombres réels.
4.3 Combiner des tableaux de formes différentes par diffusion
La diffusion permet à des tableaux de formes différentes de participer à des calculs élément par élément. L’alignement des axes détermine quelles valeurs sont appariées et lesquelles sont répétées.
Comparer les dimensions à partir de la droite
Aligne les formes par leur extrémité droite. Dans chaque paire, les longueurs d’axe doivent être égales ou l’une d’elles doit valoir 1. Les axes manquants à gauche comptent comme des axes de longueur 1. Un axe de longueur un est conceptuellement étiré pour correspondre à l’autre longueur ; NumPy n’a pas besoin de copier les valeurs répétées en entrée.
Pour (4, 3) et (3,), les dernières longueurs correspondent et valent 3. La dimension manquante à gauche se comporte comme si elle valait 1 et s’étire à 4. Le résultat est (4, 3) : le vecteur s’applique à chaque ligne. (4, 3) et (4,) échouent car les dernières longueurs, 3 et 4, diffèrent et aucune ne vaut 1. Une paire incompatible déclenche ValueError.
Centrer ou centrer et réduire les colonnes
X = np.array([[1, 10], [2, 20], [3, 30]])
centered = X - X.mean(axis=0)
Les moyennes des colonnes sont [2. 20.], de forme (2,). Elles s’alignent sur le dernier axe de (3, 2), ce qui donne [[-1. -10.] [0. 0.] [1. 10.]]. Diviser le résultat centré par X.std(axis=0) centre et réduit chaque colonne, ce qui produit environ −1,22, 0 et 1,22 de haut en bas dans les deux colonnes. La dispersion de chaque colonne doit être non nulle pour cette division.
Conserver un axe pour les calculs par ligne
Utilise une table de résultats pour quatre élèves et trois tests :
scores = np.array([[78, 85, 92], [64, 70, 58],
[88, 91, 95], [72, 68, 80]])
scores.mean(axis=1) a pour forme (4,). Il ne peut pas être diffusé avec (4, 3) pour appliquer une moyenne par ligne. Conserve l’axe supprimé :
row_mean = scores.mean(axis=1, keepdims=True)
centered = scores - row_mean
row_mean a maintenant pour forme (4, 1). Son premier axe de longueur 4 correspond aux lignes ; son dernier axe de longueur 1 s’étire sur trois colonnes. scores.mean(axis=1)[:, np.newaxis] crée la même forme. Pour la ligne [78, 85, 92], la soustraction de sa moyenne de 85 donne [-7. 0. 7.].
Utiliser la même règle pour construire une table
np.arange(1, 4)[:, np.newaxis] * np.arange(1, 5) combine (3, 1) et (4,). Les deux tableaux s’étendent jusqu’à la forme du résultat (3, 4), ce qui produit [[1 2 3 4] [2 4 6 8] [3 6 9 12]].
L’extension peut aussi être involontaire. Une colonne de forme (3, 1) moins un vecteur de forme (3,) crée les neuf différences entre toutes les paires, de forme (3, 3). Si tu voulais trois différences entre éléments correspondants, donne aux deux entrées la forme (3,), par exemple avec column.ravel().
Pondérer chaque colonne avant l’addition
Pour la même table de résultats et w = np.array([0.2, 0.3, 0.5]), scores * w applique les trois coefficients à chaque ligne. La somme avec .sum(axis=1) donne [87.1 62.8 92.4 74.8]. Le premier résultat est 15,6 + 25,5 + 46,0 = 87,1.
Points clés
- Aligne les formes à partir de la droite ; les longueurs appariées doivent être égales ou comprendre 1.
- Un axe de longueur un détermine la direction de l’extension.
- Les indicateurs par colonne s’alignent généralement directement sur une table.
- Conserve les indicateurs par ligne sous forme de colonnes avec
keepdims=True. - La diffusion peut créer involontairement une table de toutes les paires.
- Pondère les colonnes avant de les réduire sur chaque ligne.
5Calculer des indicateurs sur des tableaux par agrégation selon les axes
Une table peut produire un total global, un indicateur par enregistrement ou un indicateur par variable. Décide quel axe réduire, puis choisis une statistique qui répond à ta question. Les positions, les sommes cumulées et les rangs après tri offrent différentes vues des données. Les valeurs manquantes et les conditions demandent des décisions spécifiques, car le filtrage ou le remplacement peut modifier à la fois les observations prises en compte et le sens du résultat.
5.1 Agréger un tableau entier ou selon un axe
Une agrégation combine des valeurs pour obtenir moins de résultats : un total, une moyenne, une valeur extrême ou un indicateur de dispersion. Choisir l’axe fait partie du choix de la question, car il détermine quels groupes de valeurs sont combinés.
Réduire l’axe indiqué
Pour une table de forme (4, 3) avec quatre élèves et trois tests, une agrégation sans axis utilise les 12 valeurs. scores.sum() donne un total unique. scores.mean(axis=0) réduit l’axe des élèves et conserve trois moyennes de tests. scores.mean(axis=1) réduit l’axe des tests et conserve quatre moyennes d’élèves.
scores = np.array([[78, 85, 92], [64, 70, 58],
[88, 91, 95], [72, 68, 80]])
La somme globale est de 941. Les moyennes des colonnes sont [75.5 78.5 81.25] ; les moyennes des lignes sont environ [85. 64. 91.33 73.33]. Demande-toi quel axe doit disparaître. Dire « l’axe 0 signifie chaque ligne » inverse l’opération : l’axe 0 combine les lignes.
Choisir la grandeur à renvoyer
| Opération | Type de résultat |
|---|---|
sum, prod | Total ou produit |
mean | Moyenne arithmétique |
min, max | Valeur extrême |
argmin, argmax | Position d’une valeur extrême |
std, var | Écart-type ou variance |
Les méthodes comme a.sum() et les fonctions comme np.sum(a) expriment la même opération de base. Les méthodes de NumPy évitent le comportement différent des fonctions intégrées de Python. Par exemple, la fonction Python sum(scores) additionne les tableaux correspondant aux lignes pour produire les totaux des colonnes, tandis que scores.sum() combine tous les éléments. La fonction Python max(scores) tente de comparer les lignes et déclenche une erreur liée à une valeur de vérité ambiguë.
Les positions diffèrent des valeurs
scores.mean(axis=1).argmax() vaut 2 : le troisième élève a la moyenne la plus élevée. argmax renvoie la première position lorsque plusieurs valeurs maximales sont ex æquo. Sans axe sur une table, il renvoie un indice du tableau aplati dans l’ordre par lignes ; scores.argmax() vaut 8. np.unravel_index(8, scores.shape) retrouve les coordonnées (2, 2).
Utilise keepdims=True lorsqu’un indicateur doit s’aligner sur la table d’origine. scores.sum(axis=1, keepdims=True) a pour forme (4, 1), ce qui convient pour une valeur de normalisation par ligne. Sans cet argument, le résultat a pour forme (4,).
Conserver les totaux intermédiaires lorsque l’ordre compte
np.cumsum([3, 1, 4, 1, 5]) donne [3 4 8 9 14]. Chaque position contient le total jusqu’à ce point. np.cumprod([1, 2, 3, 4]) donne de même [1 2 6 24]. np.diff([3, 1, 4, 1, 5]) donne les quatre variations entre valeurs voisines [-2 3 -3 4]. Sur une table, indique axis=1 pour obtenir des sommes cumulées distinctes sur les lignes.
Préciser la convention de dispersion
std et var divisent par défaut la somme des carrés des écarts par le nombre de valeurs : ddof=0. Utilise ddof=1 pour la formule d’échantillon, dont le diviseur est inférieur d’une unité. Pour [2, 4, 4, 4, 5, 5, 7, 9], la moyenne est de 5, l’écart-type par défaut est de 2,0 et l’écart-type d’échantillon est d’environ 2,14. Un compte rendu doit indiquer clairement la convention utilisée.
Points clés
- L’argument
axisdésigne l’axe réduit. - Sans axe, un seul indicateur est calculé sur tout le tableau.
argminetargmaxrenvoient des positions, dont la première en cas d’ex æquo.keepdims=Trueconserve les axes réduits avec une longueur de 1.- Les fonctions cumulées conservent les résultats intermédiaires.
- NumPy utilise
ddof=0par défaut ;ddof=1sélectionne le diviseur de la formule d’échantillon. - Préfère les agrégations NumPy aux fonctions intégrées de Python sur les tableaux.
5.2 Utiliser les médianes, les centiles, le tri et les valeurs distinctes
Les indicateurs fondés sur l’ordre décrivent la place des valeurs dans une distribution triée. Le tri permet aussi de classer les enregistrements, mais une table doit être traitée avec soin pour conserver ensemble les champs de chaque enregistrement.
Repérer le milieu et les quartiles
Pour x = np.array([12, 15, 11, 20, 18, 14]), l’ordre croissant est [11 12 14 15 18 20]. Avec six valeurs, np.median(x) calcule la moyenne des deux valeurs centrales, 14 et 15, ce qui donne 14,5. Lorsque l’effectif est impair, la médiane est l’unique valeur centrale.
np.percentile(x, q) prend un pourcentage de 0 à 100. np.quantile(x, q) prend la fraction équivalente de 0 à 1. Leur interpolation linéaire par défaut peut donner une valeur située entre des observations. Pour six valeurs, la position du 25e centile, en comptant à partir de zéro, est 0,25 × 5 = 1,25. Elle se trouve au quart du chemin entre 12 et 14, ce qui donne 12,5. Les 50e et 75e centiles valent 14,5 et 17,25, donc l’écart interquartile est de 4,75.
La médiane est moins sensible à une valeur extrême que la moyenne. Ajouter 200 à ces données fait passer la moyenne de 15,0 à environ 41,4 ; la médiane passe de 14,5 à 15,0. Aucun de ces deux indicateurs ne décrit à lui seul toute la distribution.
Choisir des données triées ou des positions de tri
np.sort(x) renvoie une copie triée. x.sort() modifie x et renvoie None, donc y = x.sort() ne place pas les valeurs triées dans y. Pour obtenir les valeurs dans l’ordre décroissant, utilise np.sort(x)[::-1].
Sur un tableau à 2 dimensions, le tri s’effectue par défaut selon le dernier axe, en triant chaque ligne indépendamment. axis=0 trie chaque colonne indépendamment. Aucune de ces opérations ne trie les enregistrements. Pour tab = np.array([[3, 1], [1, 2], [2, 0]]), np.sort(tab, axis=0) donne [[1 0] [2 1] [3 2]], en séparant des valeurs qui appartenaient à l’origine au même enregistrement.
Pour préserver les enregistrements, obtiens un ordre à partir de la colonne servant de clé et applique-le aux lignes entières :
order = tab[:, 0].argsort()
ranked = tab[order]
# array([[1, 2], [2, 0], [3, 1]])
Le même ordre d’indices peut réordonner des vecteurs associés. Si avg = np.array([85.0, 64.0, 91.33, 73.33]) et names = np.array(['Ana', 'Ben', 'Chen', 'Dara']), order = np.argsort(avg)[::-1] classe les moyennes dans l’ordre décroissant. names[order] donne ['Chen' 'Ana' 'Dara' 'Ben'].
Compter les valeurs distinctes et vérifier l’appartenance
np.unique renvoie les valeurs distinctes triées. Avec return_counts=True, elle renvoie aussi les effectifs correspondants :
colors = np.array(['red', 'blue', 'red', 'green', 'blue', 'red'])
values, counts = np.unique(colors, return_counts=True)
Les résultats sont ['blue' 'green' 'red'] et [2 1 3]. values[counts.argmax()] trouve la valeur la plus fréquente, 'red'. Les positions des effectifs correspondent à celles des valeurs distinctes.
np.isin(a, allowed) renvoie un masque indiquant l’appartenance à une collection. Pour a = np.arange(1, 6), np.isin(a, [2, 4]) donne [False True False True False], prêt à sélectionner ces valeurs ou les enregistrements associés.
Points clés
- La médiane utilise la position dans les données triées et est peu sensible aux valeurs extrêmes.
- Les centiles utilisent l’échelle de 0 à 100 ; les quantiles utilisent celle de 0 à 1.
- L’interpolation par défaut des centiles peut donner une valeur située entre des observations.
np.sortcopie les données ; la méthode.sort()d’un tableau le modifie et renvoieNone.- Utilise les positions de
argsortpour conserver l’alignement des enregistrements et des tableaux associés. unique(..., return_counts=True)associe les valeurs distinctes à leurs effectifs.isinconstruit un masque d’appartenance.
5.3 Calculer des indicateurs en tenant compte des valeurs manquantes et de conditions
Les données manquantes et les sous-ensembles filtrés nécessitent une règle explicite pour calculer les indicateurs. Un résultat numérique peut être erroné même lorsque l’opération sur le tableau s’exécute correctement : un code de valeur manquante peut être compté comme une mesure, ou un sous-ensemble vide peut être pris pour une moyenne ayant un sens.
Repérer les valeurs manquantes avant de calculer des indicateurs
NaN se propage dans les sommes et les moyennes ordinaires. Pour x = np.array([3.0, np.nan, 5.0]), x.sum() et x.mean() donnent tous deux NaN. np.nansum(x) donne 8,0 et np.nanmean(x) donne 4,0, en sautant la position manquante. Parmi les fonctions apparentées figurent nanmax, nanmin, nanstd et nanmedian. Si toutes les valeurs sont manquantes, nanmean renvoie NaN avec un avertissement, car aucune valeur observée ne reste.
Pour des mesures de capteur en °C :
r = np.array([21.5, np.nan, 22.1, 23.0, np.nan, 21.9])
missing = np.isnan(r)
missing.sum() vaut 2, missing.mean() vaut environ 0,33, et r[~missing] conserve quatre mesures. np.nanmean(r) vaut 22,125, en utilisant uniquement ces quatre valeurs. La comparaison r == np.nan ne repérerait pas les mesures manquantes.
Convertir d’abord les codes de valeur manquante
Un nombre comme −999 peut représenter des données manquantes dans un système d’entrée. NumPy le traite comme une mesure réelle jusqu’à ce que tu le remplaces :
v = np.array([12, -999, 15, -999, 9]).astype(float)
v[v == -999] = np.nan
np.nanmean(v) # 12.0
Convertis d’abord les données en nombres à virgule flottante, car un tableau d’entiers ne peut pas stocker NaN. Ce remplacement ne convient que si −999 est défini comme le code de valeur manquante pour ces données.
Le remplacement modifie la distribution
Remplacer les températures manquantes par zéro donne une moyenne de 14,75 dans l’exemple, alors qu’aucune température de zéro n’a été observée. Les remplacer par la moyenne observée, 22,125, préserve cette moyenne mais réduit la dispersion apparente. Une valeur de remplacement est une estimation introduite : son effet doit donc être pris en compte dans la décision d’analyse.
Pour une table D à 2 dimensions, np.nanmean(D, axis=0) calcule un indicateur sur les valeurs observées de chaque colonne. Chaque colonne peut avoir un effectif différent. Pour supprimer les lignes contenant au moins une valeur manquante :
complete = ~np.isnan(D).any(axis=1)
clean_rows = D[complete]
La réduction crée une décision par ligne ; la négation conserve les lignes sans élément manquant. Avec D = np.array([[1., 2.], [np.nan, 4.], [5., np.nan], [7., 8.]]), cela conserve [[1. 2.] [7. 8.]].
Calculer un indicateur selon une condition ou par groupe
Pour les températures t, t[t > 20].mean() calcule la moyenne des seuls jours au-dessus de 20 °C. Dans des données regroupées, utilise un masque d’étiquettes correspondant : avec group = np.array(['A', 'B', 'A', 'B', 'A']) et value = np.array([10, 20, 14, 26, 12]), value[group == 'A'].mean() vaut 12,0 et la moyenne correspondante du groupe B vaut 23,0. Parcours np.unique(group) pour répéter ce calcul pour chaque groupe.
Avant de calculer un indicateur sur un sous-ensemble filtré, vérifie mask.any(). La moyenne d’une sélection vide est NaN avec un avertissement, tandis que sa somme est 0. Ce zéro peut être un total valide pour une sélection vide, mais il ne prouve pas qu’une mesure était présente.
Points clés
- Les sommes et moyennes ordinaires propagent NaN ; les versions qui ignorent les NaN les sautent.
- Convertis les codes définis comme valeurs manquantes en NaN dans un stockage à virgule flottante.
- Remplacer les valeurs manquantes modifie les statistiques.
- Les tests de valeurs manquantes par ligne peuvent repérer les enregistrements complets.
- Combine les masques d’étiquettes ou de conditions avec des agrégations.
- Vérifie qu’un sous-ensemble n’est pas vide avant d’interpréter sa moyenne.
6Générer des nombres aléatoires et réaliser des simulations
Les tableaux aléatoires permettent de réaliser des échantillonnages reproductibles et des expériences pratiques. Crée un objet Generator initialisé par une graine, choisis une loi et une forme de sortie, et préserve les relations entre enregistrements lorsque tu mélanges ou découpes les données. Dans une simulation, rends explicite la structure des épreuves avant de calculer les événements ou les positions successives. Compare les résultats à des cas simples et exacts, et distingue la variabilité ordinaire de l’échantillonnage des erreurs de code.
6.1 Tirer des échantillons aléatoires reproductibles avec un objet Generator
Un générateur de nombres aléatoires permet l’échantillonnage, le mélange et la simulation. Une graine rend l’état initial reproductible, afin que tu puisses réexécuter une analyse tout en examinant sa logique.
Créer un objet Generator et le réutiliser
rng = np.random.default_rng(42)
NumPy recommande cette interface Generator pour le nouveau code. Son générateur de bits par défaut est PCG64. Sans graine, default_rng() obtient une nouvelle source d’entropie du système d’exploitation. Les anciens appels comme np.random.seed et np.random.rand utilisent un état global partagé ; les objets Generator permettent à une analyse de gérer directement son propre état.
Les valeurs pseudo-aléatoires proviennent d’un algorithme déterministe. Un même état initial et une même suite d’appels reproduisent la suite dans le même environnement. Chaque tirage fait évoluer l’état. Créer un nouvel objet Generator avec la graine 42 à chaque passage dans une boucle redémarre la suite et répète les mêmes premiers tirages au lieu de la poursuivre. Consigne la version de NumPy et le code en plus de la graine, car la compatibilité de la suite n’est pas garantie entre les versions ni dans tous les environnements. Pour les mots de passe ou les jetons de sécurité, utilise le module Python secrets.
Choisir une loi et une forme de sortie
| Appel | Signification |
|---|---|
rng.random(5) | Cinq décimaux de 0 inclus à 1 exclu |
rng.uniform(2, 8, size=5) | Cinq tirages uniformes dans l’intervalle de 2 à 8 |
rng.integers(1, 7, size=10) | Dix entiers de 1 à 6 inclus |
rng.normal(loc=170, scale=10, size=(3, 4)) | Un échantillon de 3 lignes et 4 colonnes suivant une loi normale |
size peut être un nombre d’éléments ou un tuple de forme. Pour normal, loc est la moyenne de la loi et scale est son écart-type. Une variance de 100 nécessite donc scale=10. La moyenne et l’écart-type observés dans un petit échantillon ne correspondent pas nécessairement de façon exacte aux paramètres de la loi.
Pour les tirages d’entiers, la borne supérieure est exclue par défaut. Un dé nécessite integers(1, 7), puisque integers(1, 6) ne peut pas tirer 6. integers(1, 6, endpoint=True) inclut la borne supérieure et modélise aussi un dé.
Échantillonner des valeurs avec ou sans remise
rng.choice(['heads', 'tails'], size=5) effectue cinq tirages avec remise. Une valeur peut apparaître plusieurs fois. Pour tirer des positions distinctes, utilise replace=False ; demander plus de positions que n’en contient la population déclenche ValueError. Les probabilités peuvent être fournies sous la forme p=[0.7, 0.3], dans le même ordre que les valeurs, et leur somme doit être égale à 1.
Un tirage sans remise empêche de sélectionner deux fois une même position en entrée. Si les données fournies contiennent elles-mêmes des doublons, des valeurs égales peuvent tout de même apparaître dans l’échantillon.
Mélanger les enregistrements sans séparer leurs champs
rng.shuffle(a) réorganise le tableau existant et renvoie None. rng.permutation(a) renvoie une copie mélangée. rng.permutation(10) donne les entiers de 0 à 9 dans un ordre aléatoire, utiles comme indices de lignes.
Pour un tableau à 2 dimensions, l’axe par défaut est 0 : les lignes complètes se déplacent ensemble. Les champs de chaque observation restent ainsi alignés. Pour mélanger deux tableaux associés de manière cohérente, génère une seule permutation des indices de leurs enregistrements communs et applique-la aux deux tableaux.
Points clés
- Crée une seule fois un objet Generator initialisé par une graine et réutilise son état qui évolue.
- La reproductibilité dépend de la graine, des appels et de l’environnement numérique.
- Les tirages d’entiers excluent la borne supérieure sauf avec
endpoint=True. - Pour la loi normale,
scaleest l’écart-type, et non la variance. choiceéchantillonne avec remise par défaut.shufflemodifie le tableau ;permutationrenvoie un résultat mélangé.
6.2 Réaliser des simulations vectorisées
Une simulation vectorisée représente des épreuves répétées sous forme de tableaux, applique la règle de l’événement à ces tableaux et calcule des indicateurs sur les résultats. La forme du tableau doit montrer ce que contient une épreuve.
Transformer un événement en proportion
rng = np.random.default_rng(42)
rolls = rng.integers(1, 7, size=100_000)
estimate = (rolls == 6).mean()
Le masque est vrai pour chaque 6 observé. Sa moyenne estime la probabilité de cet événement, proche de 1/6, soit environ 0,1667. rolls.mean() répond à une autre question : la moyenne des faces obtenues, proche de 3,5. Une graine fixe reproduit une estimation ; elle ne rend pas cette estimation exacte.
La vectorisation évite le travail au niveau de Python pour chaque tirage, ce qui rend souvent les grandes simulations beaucoup plus rapides qu’une boucle. Le gain de vitesse dépend du calcul, de la taille du tableau et de l’ordinateur : ce n’est donc pas une propriété fixe de l’événement.
Utiliser une ligne par épreuve à plusieurs valeurs
Pour simuler deux dés à chaque épreuve :
dice = rng.integers(1, 7, size=(100_000, 2))
totals = dice.sum(axis=1)
p_seven = (totals == 7).mean()
La table contient 100 000 lignes d’épreuves et deux colonnes de dés. Réduire l’axe 1 produit un total par épreuve. Six des 36 paires ordonnées équiprobables ont une somme égale à 7, donc la probabilité estimée devrait être proche de 6/36. Réduire l’axe 0 donnerait au contraire deux totaux sur l’ensemble des épreuves et ferait perdre l’événement défini par épreuve.
Les simulations plus grandes restent variables
Pour des épreuves indépendantes, l’erreur-type d’une proportion estimée est :
Ici, est la probabilité de l’événement et le nombre d’épreuves. Pour obtenir un 6 avec un dé en 100 000 épreuves, elle est d’environ 0,0012. Une approximation normale situe environ 95 % des estimations à moins de 0,0023 de 1/6. Multiplier le nombre d’épreuves par 100 divise l’erreur-type par 10. Davantage de tirages ne corrigent pas un événement mal codé.
Construire et examiner une marche aléatoire
steps = rng.choice([-1, 1], size=1000) tire des pas vers la gauche ou vers la droite. walk = steps.cumsum() donne la position après chaque pas. Son maximum et son minimum repèrent les positions extrêmes atteintes. Pour trouver le premier point situé à au moins 10 unités du départ :
hit = np.abs(walk) >= 10
if hit.any():
step_count = hit.argmax() + 1
argmax repère le premier élément vrai, mais renvoie aussi 0 lorsque tous les éléments sont faux. Le test any() distingue un passage effectif de l’absence de passage. Ajoute 1 car la position 0 du tableau est la position après le pas 1.
Pour plusieurs marches, rng.choice([-1, 1], size=(5000, 1000)).cumsum(axis=1) effectue le cumul séparément sur chaque ligne. walks[:, -1] sélectionne toutes les positions finales ; leur moyenne est proche de 0 et leur écart-type proche de la racine carrée de 1 000, soit environ 31,6.
Utiliser des permutations et des vérifications exactes
Une répartition aléatoire de 100 enregistrements peut utiliser idx = rng.permutation(100), puis data[idx[:80]] et data[idx[80:]]. Les deux tranches disjointes d’une même permutation attribuent chaque enregistrement exactement une fois. Pour une simulation, compare un cas simple à une réponse exacte, comme une moyenne de 3,5 pour un dé, avant de faire confiance à des résultats plus complexes.
Points clés
- Représente clairement une épreuve dans la forme du tableau.
- La moyenne de valeurs booléennes estime la probabilité d’un événement.
- Réduis les valeurs au sein des épreuves avant de combiner les résultats entre épreuves.
- L’erreur-type diminue avec la racine carrée du nombre d’épreuves.
- Vérifie qu’un passage a eu lieu avant d’utiliser
argmaxpour repérer le premier passage. - Une permutation peut produire des répartitions aléatoires disjointes des enregistrements.
- Valide la logique d’une simulation à l’aide d’un cas simple dont le résultat est exact.
Tableaux NumPy et calcul vectorisé : exemples
1Construire un tableau de mesures fiable
14 étapes
- 1IntroductionPlanifier les enregistrements et les mesures
Une table de mesures demande deux décisions avant tout calcul : ce que représente chaque axe et le type de valeurs à stocker. Nous allons construire une petite table, examiner sa forme et choisir des méthodes de création et de conversion qui préservent les données.
Garde
import numpy as npen haut du script. Le nomnpdonne accès aux fonctions NumPy utilisées dans les exemples. - 2ExplicationLire une table à travers ses axes
Crée
a = np.array([[2, 4, 6], [3, 5, 7]]). La séquence extérieure fournit deux lignes ; chaque séquence intérieure fournit trois valeurs.a.shapevaut(2, 3),a.ndimvaut 2 eta.sizevaut 6. La forme décrit la disposition, ndim compte les axes et size compte tous les éléments. Si chaque ligne est un enregistrement, cette table contient deux enregistrements de trois mesures chacun. - 3Point cléDes tailles égales peuvent avoir des structures différentes
Un vecteur de longueur six a pour forme
(6,). Une table d’une ligne a pour forme(1, 6)et une table d’une colonne a pour forme(6, 1). Ces trois tableaux contiennent chacun six valeurs, mais seules les deux tables ont des axes distincts pour les lignes et les colonnes.La virgule finale dans
(6,)indique un tuple à un élément. C’est une information utile : le vecteur a un seul axe, il n’a donc pas de direction de ligne distincte à transposer en colonne. - 4DéfiPrévoir une multiplication avant de l’exécuter
Quels sont les résultats de
[2, 5] * 2et denp.array([2, 5]) * 2?---reveal---
La liste devient
[2, 5, 2, 5]. Le tableau devient[4 10]. Les listes répètent leur contenu lorsqu’elles sont multipliées par un entier ; les tableaux numériques multiplient les valeurs à chaque position. Le tableau conserve sa forme, ce qui permet d’appliquer un calcul à chaque valeur enregistrée. - 5ExempleRéserver une table de forme connue
Supposons que deux stations fournissent chacune quatre mesures de précipitations en millimètres. Crée
rain = np.zeros((2, 4)), puis effectue l’affectationrain[0] = [4.0, 0.0, 3.5, 6.0].Le tuple
(2, 4)est un seul argument de forme. Zeros utilise par défaut un stockage à virgule flottante, donc la mesure 3,5 est conservée. Réserver une seule fois la forme finale évite de copier à répétition un tableau qui grandit à mesure que les mesures arrivent. - 6ConseilChoisir délibérément le remplissage initial
Utilise
zeroslorsque des zéros initiaux ont un sens,onespour des uns etfull(shape, value)pour une autre valeur répétée. Leurs noms décrivent le contenu initial.emptyne fait que réserver un espace de stockage. Ses valeurs initiales ne sont pas prêtes à l’emploi : chaque élément doit donc être rempli avant d’être lu. Une table remplie de zéros est plus facile à examiner lorsqu’on écrit du code qui n’affectera que certains de ses éléments. - 7ExplicationCompter séparément les points et les intervalles
Pour des positions de mesure allant de 0 m à 2 m inclus par intervalles de 0,5 m, il y a cinq points et quatre intervalles.
np.linspace(0, 2, 5)crée ces points et inclut les deux bornes.np.arange(0, 2, 0.5)utilise un pas et exclut la borne de fin : il omet donc 2 m. Les arrondis en virgule flottante peuvent aussi rendre les grilles décimales dearangeinattendues ; utiliselinspacelorsque le nombre de points est imposé. - 8DéfiChoisir une grille à partir de ses bornes
Un balayage nécessite neuf positions régulièrement espacées de 0 cm à 4 cm, les deux bornes incluses. Quel appel de création convient et quel est l’espacement ?
---reveal---
Utilise
np.linspace(0, 4, 9). Neuf points forment huit intervalles sur 4 cm, donc l’espacement est de 0,5 cm. Un troisième argument égal à 8 demanderait huit points, ne laissant que sept intervalles et produisant un espacement différent entre les mesures. - 9ExplicationExaminer le type de données inféré
np.array([1, 2.5])devient un tableau à virgule flottante car un seul type de données partagé doit contenir les deux valeurs. Mélanger un nombre et du texte peut au contraire transformer toutes les valeurs en texte et faire échouer les calculs.Examine
a.dtypelorsque les valeurs ne se comportent pas comme prévu.a.itemsizeindique le nombre d’octets de stockage par élément ; le multiplier para.sizedonnea.nbytes, le nombre total d’octets occupés par les éléments. - 10ExempleObserver une affectation qui supprime les décimales
Pars de
counts = np.array([2, 4, 6]), puis exécutecounts[0] = 3.8. Le premier élément devient 3 car le stockage existant reste de type entier.Pour conserver les décimales ultérieures, crée d’abord un stockage à virgule flottante avec
values = counts.astype(float).astypecrée une copie convertie. Il ne change pas le type de données du tableau d’origine et ne récupère pas la partie fractionnaire déjà supprimée par une affectation antérieure. - 11Point cléLa conversion et l’arrondi sont distincts
np.array([2.8, -2.8]).astype(int)donne[2 -2]: la troncature s’effectue vers zéro.np.roundarrondit au plus proche, les valeurs exactement à mi-chemin allant vers le nombre pair ; ainsi, 2,5 est arrondi à 2,0.Les petits types entiers présentent un autre risque. Un
uint8ne peut pas contenir 260 : un calcul sur tableau comme 250 plus 10 peut donc boucler et donner 4. Passe à un type de données plus large avant de calculer des valeurs susceptibles de dépasser sa plage. - 12DéfiPréserver une mesure manquante
Tu disposes de
a = np.array([5, 7, 9])et dois indiquer que la mesure centrale est manquante. Quelle préparation le tableau nécessite-t-il avant d’y affecter NaN ?---reveal---
Convertis-le en stockage à virgule flottante :
a = a.astype(float), puis affectea[1] = np.nan. Un stockage entier ne peut pas représenter NaN. Le résultat est[5. nan 9.]; remplacer la valeur par zéro enregistrerait une valeur numérique au lieu de signaler une mesure manquante. - 13DéfiCombiner création et modification ultérieure
Tu crées
template = np.array([1, 2]), puis tu as besoin d’un tableau de même forme dont les valeurs pourront ensuite inclure 1,5 et NaN. Quel choix de création permet de conserver ces possibilités ?---reveal---
Utilise un type à virgule flottante, par exemple
np.zeros_like(template, dtype=float). Par défaut, la fonction like hériterait du stockage entier. La forme peut rester(2,), tandis que le choix d’un type à virgule flottante autorise à la fois la mesure fractionnaire et le marqueur de valeur manquante. - 14RécapitulatifExaminer la structure avant de calculer
Pour le prochain tableau que tu crées, examine
shape,sizeetdtypeavant d’effectuer des calculs. Vérifie que chaque axe représente le groupe de valeurs voulu et que le stockage peut contenir les mesures que tu vas affecter.Choisis délibérément un nombre de points ou un pas lorsque tu génères une grille. Si des valeurs décimales ou NaN doivent apparaître, prévois un stockage à virgule flottante avant de les écrire dans le tableau.
2Sélectionner des enregistrements et maîtriser les effets des modifications
16 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDéterminer quelles valeurs doivent figurer dans le résultat
- 2ExplicationSuivre le début, la fin et le pas
- 3ExempleSélectionner des lignes et des colonnes en une expression
- 4DéfiConserver un axe de colonne
- 5ExempleSuivre une écriture à travers une vue
- 6ConseilRendre l’indépendance explicite
- 7ExplicationApparier des coordonnées ou choisir un bloc
- 8DéfiDistinguer une copie d’une affectation directe
- 9ExplicationTransformer une condition en sélection
- 10ExempleCombiner les bornes d’un intervalle
- 11Point cléCompter les événements ou calculer la moyenne de leurs valeurs
- 12ExempleChoisir entre remplacement et filtrage
- 13DéfiConserver les lignes complètes
- 14ConseilRepérer NaN sans test d’égalité
- 15DéfiModifier indépendamment les enregistrements sélectionnés
- 16RécapitulatifVérifier la cible de chaque modification
3Donner aux valeurs la forme et le regroupement appropriés
12 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionRendre le regroupement visible dans la forme
- 2ExempleRegrouper des valeurs consécutives en périodes
- 3ExplicationDéduire une dimension manquante
- 4ExemplePermuter le sens des lignes et des colonnes
- 5DéfiCréer une colonne à partir d’un vecteur
- 6ConseilChoisir l’aplatissement en pensant aux modifications
- 7ExplicationProlonger un axe existant
- 8ExempleAjouter plutôt un axe de lots
- 9DéfiCréer deux colonnes de mesures
- 10ExempleDécouper selon des bornes ou un nombre de parties
- 11DéfiReconstituer une table à partir de lots de lignes
- 12RécapitulatifLire les formes comme des choix sur les données
4Calculer sur les enregistrements sans boucle Python
15 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionLaisser l’expression décrire le calcul
- 2ExempleMultiplier les valeurs appariées et calculer leur total
- 3ExplicationUtiliser le bon opérateur de produit
- 4ConseilVérifier la destination et le dénominateur
- 5DéfiChoisir la référence d’une variation en pourcentage
- 6ExplicationAppliquer des fonctions mathématiques aux tableaux
- 7ExempleCalculer des distances par étapes
- 8DéfiComparer maximum et réduction
- 9ConseilExaminer les arrondis et les valeurs invalides
- 10ExplicationAligner les formes par leur extrémité droite
- 11ExempleConserver les moyennes des lignes sous forme de colonne
- 12Point cléUne diffusion valide peut répondre à la mauvaise question
- 13DéfiPrévoir le résultat d’une diffusion
- 14DéfiPondérer des mesures centrées
- 15RécapitulatifVérifier les valeurs, les appariements et la forme de sortie
5Calculer des indicateurs sur les observations qui répondent à ta question
15 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionChoisir la question avant la statistique
- 2ExempleRéduire l’axe des mesures
- 3Point cléSuivre ce qui reste après la réduction
- 4ExempleDistinguer position, valeur et somme cumulée
- 5DéfiChoisir le diviseur de la variance
- 6ExempleRepérer une médiane et un centile
- 7ConseilTrier les enregistrements à partir des positions
- 8DéfiRetrouver une étiquette à partir de son effectif
- 9ExplicationIgnorer volontairement les valeurs manquantes
- 10ExempleConvertir un code de valeur manquante avant de calculer la moyenne
- 11Point cléLe remplacement crée des observations pour le calcul
- 12ExempleDéterminer si chaque ligne est complète
- 13DéfiReconnaître un sous-ensemble vide
- 14DéfiCalculer des indicateurs et comparer les groupes
- 15RécapitulatifIndiquer ce qui a contribué à chaque indicateur
6Réaliser une simulation reproductible, des tirages aux résultats
14 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDonner une forme claire à chaque épreuve simulée
- 2ExplicationCréer l’objet Generator une seule fois
- 3ExempleDéfinir les paramètres des tirages entiers et normaux
- 4DéfiRepérer le bogue qui répète les tirages aléatoires
- 5ConseilChoisir la remise et préserver les enregistrements
- 6ExempleEstimer un événement avec un masque
- 7ExempleRéduire les valeurs de chaque épreuve à deux dés
- 8DéfiChercher l’événement sur au moins un dé
- 9ExplicationPrévoir la variabilité d’échantillonnage
- 10ExempleCumuler les pas pour former une trajectoire
- 11ConseilVérifier que la borne a été atteinte
- 12DéfiRépartir chaque enregistrement une seule fois
- 13DéfiDéterminer ce qu’une exécution beaucoup plus grande peut corriger
- 14RécapitulatifVérifier le modèle puis sa précision
Tableaux NumPy et calcul vectorisé : QCM
Série 1 : Relier sélections, formes et indicateurs10 Questions Pratiques
Question 1 sur 10
np.arange(4, 16, 5) ?Afficher la réponseMasquer la réponse
Question 2 sur 10
template = np.array([2, 4, 6]), quelles valeurs sont créées par np.full_like(template, 1.8) avec le type de données par défaut ?Afficher la réponseMasquer la réponse
template ainsi que de sa forme. Remplir ce stockage avec 1,8 convertit chaque valeur en 1 : les trois éléments valent donc 1. Déduire un nouveau type à virgule flottante de la valeur de remplissage serait le comportement de np.full, et non de cet appel à full_like avec ses paramètres par défaut.Question 3 sur 10
a après a = np.arange(7); b = a[1:5]; c = a[[1, 4]]; b[1] = 90; c[0] = 80 ?Afficher la réponseMasquer la réponse
b partage ses données avec a et son indice 1 correspond à l’indice 2 d’origine : 90 atteint donc cette position. Le tableau c issu de l’indexation avancée est une copie indépendante : lui affecter 80 laisse donc a inchangé. Considérer les deux sélections comme des vues placerait à tort 80 à l’indice 1 du tableau d’origine.Question 4 sur 10
a = np.array([3, 6, 9, 12, 15, 18, 21]), quelles valeurs a[1:6:2] sélectionne-t-il ?Afficher la réponseMasquer la réponse
Question 5 sur 10
a et b ont pour formes (3, 2) et (3, 5). Quelle est la forme de np.concatenate([a, b], axis=1) ?Afficher la réponseMasquer la réponse
(3, 7). L’introduction d’une troisième dimension nécessiterait un empilement ; la concaténation prolonge un axe existant sans en ajouter.Question 6 sur 10
x = np.array([-3.5, 2.5]), que donne np.floor(x) - np.trunc(x) ?Afficher la réponseMasquer la réponse
[-4., 2.], tandis que la troncature donne [-3., 2.] : la soustraction donne donc [-1., 0.]. Les deux fonctions donnent le même résultat pour la valeur positive, mais diffèrent pour la valeur négative. Considérer la partie entière inférieure comme une simple suppression des décimales donnerait à tort une différence nulle pour la valeur négative.Question 7 sur 10
x = np.array([6., 8.]) et y = np.array([8., 15.]) en mètres, conserve uniquement les points situés à 12 m au plus de l’origine. Quelles distances sont conservées ?Afficher la réponseMasquer la réponse
np.hypot(x, y) : tu obtiens 10 m et 17 m. Filtre ensuite ces distances selon la limite de 12 m. Seule la distance de 10 m reste. Additionner les valeurs absolues des coordonnées donne 14 et 23, ce qui mesure un autre trajet ; ramener 17 à 12 par écrêtage remplacerait une distance hors limites au lieu d’exclure le point.Question 8 sur 10
x = np.array([10., np.nan, 16., np.nan, 22.]), quelle est la moyenne après remplacement de chaque NaN par zéro ?Afficher la réponseMasquer la réponse
Question 9 sur 10
rng.choice(np.arange(5), size=6, replace=False) ?Afficher la réponseMasquer la réponse
ValueError. Des tirages répétés seraient possibles avec remise, mais celle-ci est explicitement désactivée ici ; NumPy ne réduit pas la taille de l’échantillon demandé sans avertissement.Question 10 sur 10
dice contient 60 000 épreuves de trois dés équilibrés et a pour forme (60000, 3). Quelle expression estime la probabilité qu’une épreuve contienne au moins un 6 ?Afficher la réponseMasquer la réponse
any(axis=1) pour obtenir une décision de succès par ligne d’épreuve. La moyenne de ces décisions estime la proportion d’épreuves contenant au moins un 6. La moyenne de toutes les comparaisons au niveau des dés estime la probabilité qu’un dé donne un 6 et perd l’événement défini au niveau de l’épreuve.Série 2 : Lire des tableaux et choisir la bonne opération10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
np.array([4.9, -4.9]).astype(int) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
v = np.array([2, 8, 11, 5, 14]), quelle proportion (v >= 8).mean() renvoie-t-il ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
[batch_id, mass_kg] : d = np.array([[1, 4], [2, 9], [1, 7], [2, 5]]). Quelle est la masse moyenne des enregistrements du lot 1 dont la masse dépasse 5 kg ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
np.arange(8).reshape(2, 4).T[1] ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
np.array([5., 8.]) et les nouveaux prix sont np.array([6., 6.]). Quelles variations en pourcentage (new - old) / old * 100 donne-t-il ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
d = np.array([[9, 30], [2, 80], [5, 40]]). Comment trier les enregistrements selon leur première colonne, de la plus petite à la plus grande valeur, en conservant chaque ligne intacte ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 3 : Suivre les données à travers plusieurs opérations sur les tableaux10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
a = np.array([8, 12]); a[0] = 3.7; b = a / 2 ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
m = np.arange(20).reshape(4, 5), quelles sont la forme et les valeurs de m[1:3, 2:3] ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
t de forme (3, 4, 5), quelle est la forme de t[1, :, 2:4] ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
v = np.arange(1, 13) sont regroupées en quatre périodes consécutives de trois heures. Après permutation de l’axe des périodes et de l’axe des positions dans une période, quelle est la première ligne ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
np.array_split(np.arange(14), 4) produit-il ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
A = np.array([[2, 3], [4, 5]]), que renvoie A * A ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
X sont [2., 6.] et [8., 12.]. Il faut soustraire à chaque ligne sa propre moyenne. Quel résultat l’expression erronée X - X.mean(axis=1) donne-t-elle réellement ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
x = np.array([1., 3., 5.]), que vaut x.var(ddof=1) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
np.percentile([4, 8, 12, 20], 25) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
steps contient cinq déplacements de ±1 pour une marche. Tu as besoin de la proportion de marches qui atteignent au moins 3 unités du départ à un moment quelconque des pas enregistrés. Quelle expression calcule cette proportion ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 4 : Diagnostiquer des résultats qui semblent plausibles10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
a a pour forme (6, 4) et vérifie itemsize == 8. Tu exécutes b = a[::2, 1:], puis c = b[:, ::2].copy(). Combien d’octets le stockage des éléments de c occupe-t-il ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
np.array([4, 7]) * 3 ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
m = np.arange(12).reshape(3, 4), que vaut m[[0, 2], [1, 3]] ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
[group, reading] de d sont [[1., 6.], [2., np.nan], [1., 10.], [2., 14.], [1., np.nan]]. Comment obtenir la moyenne des mesures présentes du groupe 1 ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
v = np.arange(5), quelles sont respectivement les formes de v.T.shape et de v[:, np.newaxis].shape ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
x = np.array([-4., 2., 7.]), que produit np.maximum(x, 3) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
(3, 2) contient des valeurs appariées pour trois enregistrements. Un vecteur offset de longueur trois donne une correction par enregistrement. Tu dois ajouter chaque correction aux deux valeurs de l’enregistrement correspondant. Quelles expression et forme de résultat conviennent ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
values, counts = np.unique([4, 9, 4, 2, 9, 9], return_counts=True). Que renvoie values[counts.argmax()] ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
D = np.array([[2., 4.], [np.nan, 6.], [8., np.nan]]), que renvoie np.nanmean(D, axis=0) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
ids = np.arange(6) et un tableau de mesures distinct présentent les enregistrements dans le même ordre. Tu as besoin de quatre enregistrements d’entraînement et de deux enregistrements de test, avec les identifiants et les mesures correspondants et sans chevauchement. Quelle méthode le garantit ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 5 : Combiner les outils des tableaux dans des analyses complètes10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
np.array([5, -999, 9]), où −999 indique une valeur manquante. Tu as besoin de la moyenne observée après avoir ajouté une correction de 0,5 à chaque mesure présente. Quel est le bon résultat ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
a = np.array([2, 5, 8, 11]); b = a[1:]; c = b[[0, 2]]; b[0] = 20; c[1] = 30; a[[0, 3]] = c. Que vaut ensuite a ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
x = np.array([1., np.nan, 4., 7.]), tu veux la proportion de valeurs observées qui dépassent 3. Quelle est cette proportion ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
(2, 3). Quelle forme résulte de np.stack([a, b], axis=1) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
a = np.array([3, 6]), tu as besoin des valeurs [3.5, 6.5]. Pourquoi a = a + 0.5 fonctionne-t-il alors que a += 0.5 déclenche une erreur ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
X = np.array([[2., 6., 10.], [4., 8., 12.]]) est centré séparément dans chaque ligne. Quel résultat l’expression correcte doit-elle produire ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
X = np.array([[3., 9.], [5., 7.], [8., 4.]]) contient deux mesures. Centre chaque ligne, puis pondère la première colonne par 0,25 et la seconde par 0,75 et additionne les valeurs de chaque ligne. Quel résultat obtiens-tu ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
x = np.array([7, 12, 12, 4]), que vaut x.argmax() ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
[group, reading] de D sont [[1., 4.], [1., np.nan], [2., 8.], [2., 10.], [2., np.nan]]. Remplace chaque mesure manquante par la moyenne observée de son propre groupe. Quelle est la moyenne des cinq mesures après remplacement ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Tu bloques sur ton propre exercice ? Aide aux Devoirs
Mots-Clés
A
affectation par indexation
data[:2, 0] = 0 remplace les valeurs de la première colonne dans les deux premières lignes de la table.agrégation
table.mean(axis=0) combine les enregistrements pour donner une moyenne par colonne de mesures.agrégation ignorant les NaN
nanmean ou nanmedian.np.nanmean([5., np.nan, 9.]) renvoie 7,0 en calculant la moyenne des deux valeurs observées.aliasage
b = a, l’expression b is a est vraie et une affectation par l’un ou l’autre nom modifie ce même tableau.aplatissement
flatten copie les données, tandis que ravel peut partager les données d’origine.table.flatten() lorsque tu as besoin d’un résultat distinct à 1 dimension dont les modifications ne peuvent pas changer la table.argmax
[3, 8, 8, 2], argmax renvoie 1, qui est une position et non la valeur maximale 8.axe
data[:, 0] conserve toutes les positions sur l’axe des lignes et prend la première colonne.axe de réduction
keepdims.(6, 4) laisse la forme (6,), avec un résultat par ligne d’origine.axe singleton
[:, None] à un vecteur de longueur quatre crée la forme (4, 1), adaptée à une valeur par ligne de table.C
calcul élément par élément
(2, 3) avec * donne six produits appariés dans un autre tableau (2, 3).centile
centrage
X - X.mean(axis=0) soustrait la moyenne de chaque colonne aux valeurs de cette même colonne.centrage et réduction
(X - X.mean(axis=0)) / X.std(axis=0) centre et réduit les colonnes dont les écarts-types sont non nuls.code de valeur manquante
concaténation
(2, 4) et (5, 4) selon l’axe 0 crée une table de sept lignes et quatre colonnes.conversion de type
astype renvoie une copie convertie et certaines conversions suppriment des informations.np.array([2.7, 5.1]).astype(int) convertit les valeurs en 2 et 5 sans les arrondir au plus proche.coordonnées appariées
m[[0, 2], [1, 3]] sélectionne les coordonnées (0, 1) et (2, 3), et non un bloc de 2 lignes et 2 colonnes.copie
saved = data[:3].copy() permet de disposer d’un sous-ensemble indépendant pour des modifications ou comparaisons ultérieures.correction des degrés de liberté
ddof, la quantité soustraite du nombre de valeurs dans le diviseur d’une variance ou d’un écart-type.ddof=1, NumPy divise la somme des carrés des écarts par quatre.D
découpage
array_split autorise des parties de longueurs inégales.np.arange(9) aux positions [2, 6] donne des parties de longueurs 2, 4 et 3, car ces nombres sont des bornes.dépassement de capacité des entiers
uint8 contenant 250 et 10 donne 4 par bouclage, car ce type ne peut pas contenir 260.diffusion
(3,) à une table de forme (8, 3) applique ce vecteur à chacune des huit lignes.dimensions compatibles
(5, 1) et (4,) se combinent en (5, 4) car leurs axes alignés respectent la règle de compatibilité.E
empilement
(3, 5), avec un vecteur fourni par ligne.empilement en colonnes
np.column_stack pour créer un enregistrement de deux mesures par personne.ensemble de définition
np.sqrt(-4.0) émet normalement un avertissement et renvoie NaN.erreur-type
espacement linéaire
linspace crée cette grille à partir de ses bornes et du nombre de points.É
écart-type
std() utilise par défaut le diviseur N ; ddof=1 sélectionne la formule d’échantillon.échantillonnage avec remise
rng.choice.écrêtage
np.clip(readings, 10, 30) conserve les valeurs intérieures et remplace les mesures hors de cet intervalle par 10 ou 30.épreuve
F
fonction de création de tableaux
np.full((3, 2), 8) crée trois lignes de deux valeurs sans avoir à écrire six entrées séparées.fonction universelle
np.sqrt(distances_squared) calcule une racine carrée à chaque position sans utiliser la fonction scalaire Python math.sqrt.fonction universelle binaire
np.maximum(observed, minimum) choisit la plus grande de deux valeurs alignées à chaque position de sortie.fonction universelle unaire
np.abs sur un vecteur d’erreurs signées produit un vecteur contenant leurs valeurs absolues.forme
(2, 6) décrit deux lignes de six valeurs, tandis que la forme (12,) décrit un vecteur de douze valeurs.G
Generator
default_rng et réutilisé au moyen de méthodes qui font évoluer son état interne.rng.integers deux fois poursuit la suite ; recréer rng avec la même graine la redémarre.graine
np.random.default_rng(17) au début donne un point de départ reproductible pour l’analyse.I
imputation par la moyenne
indexation avancée
a[[4, 1, 4]] inclut deux fois la position 4 et conserve l’ordre demandé en sortie.indexation booléenne
data[data[:, 0] > 10] conserve des lignes entières selon la condition appliquée à leur première colonne.indice
infini
inf ou -inf et détectée comme non finie.inf avec un avertissement selon les réglages NumPy par défaut.L
ligne complète
~np.isnan(data).any(axis=1) crée un élément vrai pour chaque enregistrement complet d’une table numérique.loi normale
rng.normal.loc=100 et scale=4 utilise une moyenne de loi de 100 et un écart-type de 4, et non une variance de 4.M
marche aléatoire
cumsum(axis=1) crée des positions de marche distinctes sur chaque ligne d’épreuve.masque booléen
t > 25 repère les jours où la température enregistrée dépasse 25 °C.matrice identité
np.eye.np.eye(4) crée quatre uns sur la diagonale d’un tableau de 4 lignes et 4 colonnes, avec des zéros aux autres positions.médiane
[1, 3, 6, 100] est de 4,5, même si la dernière valeur exceptionnellement grande augmente fortement la moyenne.N
NaN
[4.0, np.nan, 8.0] nécessitent un stockage à virgule flottante, et np.isnan repère la position manquante.ndarray
(50, 3).nombre à virgule flottante
np.allclose lorsque de minuscules différences de représentation doivent être tolérées.O
opération en place
+= à un tableau d’entiers échoue, tandis qu’une addition ordinaire peut créer un stockage à virgule flottante.opération logique élément par élément
&, | ou ~ pour exprimer respectivement ET, OU ou la négation.(x >= 2) & (x <= 8) conserve les valeurs respectant les deux bornes, chaque comparaison étant entre parenthèses.ordre par lignes
[0, 1, 2, 3, 4, 5] en (2, 3) place [0, 1, 2] dans la première ligne.P
partage de mémoire
np.shares_memory vérifie si deux tableaux donnés se chevauchent.partie entière inférieure
np.floor applique cet arrondi vers le bas à chaque valeur fournie.np.floor donne −3,0 car −2 serait supérieur à la valeur négative d’origine.partie entière supérieure
np.ceil applique cet arrondi vers le haut aux valeurs d’un tableau.np.ceil donne −2,0, tandis que pour 2,3 il donne 3,0.pas
np.arange.np.arange(2, 15, 4) utilise un pas de 4 pour créer la suite [2 6 10 14].permutation
rng.permutation(n) en tranches d’indices disjointes pour affecter chaque enregistrement à exactement un sous-ensemble.Q
quantile
np.quantile(x, 0.75) demande la même position que np.percentile(x, 75) avec des options identiques.R
remodelage
(4, 3) lorsqu’une ligne doit contenir les trois mois de chaque trimestre.S
sélecteur entier
(8, 3), data[:, 1] renvoie la forme (8,) après suppression de l’axe des colonnes.sélection conditionnelle
np.where construit un résultat en choisissant une entrée aux positions vraies et une autre aux positions fausses.np.where(x < 0, 0, x) remplace les valeurs négatives par zéro dans un nouveau résultat de même forme globale de sélection.simulation
somme cumulée
np.cumsum([2, 5, 1]) donne [2, 7, 8], ce qui est utile pour suivre un solde à mesure que les écritures s’accumulent.somme pondérée
(scores * weights).sum(axis=1) crée un résultat pondéré pour chaque ligne lorsque les coefficients sont alignés sur les colonnes.statistique conditionnelle
mass[batch == 'B'].mean() calcule la moyenne des seules masses dont l’étiquette de lot correspondante est B.stockage homogène
np.array([2, 3.5]), l’entier fourni devient un nombre à virgule flottante afin que les deux éléments partagent ce type de stockage.suite pseudo-aléatoire
T
tableau non initialisé
np.empty(100) uniquement lorsque le code ultérieur remplira chaque élément avant qu’un calcul ne l’utilise.taille
(4, 7) a une taille de 28 même si son attribut ndim ne signale que deux axes.temps de premier passage
tranche
a[2:7:2] sélectionne les positions 2, 4 et 6, en sautant une position entre les valeurs sélectionnées.transposition
(2, 5) donne la forme (5, 2), chaque ancienne colonne devenant une ligne.tri indirect
names[np.argsort(scores)] pour lister les noms dans l’ordre des scores sans perdre l’association entre noms et scores.troncature
astype(int) donne −7 ; appliquer floor donnerait −8.type de données
data.dtype peut révéler qu’une étiquette textuelle isolée a entraîné le stockage sous forme de chaînes de valeurs qui semblent numériques.V
valeurs distinctes
np.unique les renvoie triées et peut aussi renvoyer leurs nombres d’occurrences correspondants.vectorisation
price * quantity calcule chaque total de ligne sans boucle Python distincte sur les articles.vue
b = a[1:4], l’affectation b[0] = 50 modifie a[1] car la tranche simple partage les données.À propos de cette unité
Crée ton propre Matériel d'Étude
Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.