Tableaux NumPy et calcul vectorisé

Apprends à manipuler les nombres comme le font les analystes de données en Python : sous forme de tableaux NumPy. Crée des tableaux et choisis leurs types de données, sélectionne des valeurs par position ou selon une condition, remodèle et assemble des tableaux, et remplace les boucles lentes par des calculs vectorisés, des fonctions universelles et la diffusion. Calcule des indicateurs sur les données par ligne ou par colonne, traite les valeurs manquantes et utilise un générateur de nombres aléatoires initialisé par une graine pour réaliser des simulations reproductibles.

IntermédiaireUnité 1 sur 8 de la formation Formation : Python et pandas : NumPy, analyse et visualisation de données

Ce que tu vas apprendre

  1. 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 liste
      Dé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 NumPy
      Transformer 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ées
      Lire 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.
  2. 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 tranches
      Utiliser 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 copies
      Sé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.where
      Construire des masques de valeurs vrai ou faux à partir de comparaisons, les combiner et les utiliser pour filtrer, compter, remplacer et choisir des valeurs.
  3. 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 axes
      Remodeler, 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 tableaux
      Combiner des tableaux selon un axe existant ou un nouvel axe, et découper un tableau en morceaux, en vérifiant que les formes conviennent.
  4. É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 explicite
      Utiliser 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 entiers
      Utiliser 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 diffusion
      Appliquer 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.
  5. 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 axe
      Calculer 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 distinctes
      Dé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 conditions
      Repé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.
  6. 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 Generator
      Cré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ées
      Estimer 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.

Tableaux NumPy et calcul vectorisé : cours

6 chapitres

1

Cré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 :

AttributSignificationValeur pour a
ndimNombre d’axes2
shapeLongueur de chaque axe(2, 3)
sizeNombre total d’éléments6
dtypeType de chaque élémentGé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.

ExpressionRésultat
[1, 2, 3] * 2[1, 2, 3, 1, 2, 3]
np.array([1, 2, 3]) * 2array([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.

FonctionExempleRésultat créé
np.zerosnp.zeros((3, 4))Trois lignes de quatre zéros
np.onesnp.ones((2, 3))Deux lignes de trois uns
np.fullnp.full((2, 2), 7)Un tableau de 2 lignes et 2 colonnes rempli de 7
np.emptynp.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.
  • arange indique un pas ; linspace indique un nombre de points.
  • linspace inclut les deux bornes par défaut.
  • empty doit ê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érationExempleRésultat
Divisionnp.array([7, 8]) / 2[3.5 4.]
Division entière arrondie vers le basnp.array([7, -7]) // 2[3 -4]
Restenp.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.
2

Sé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électionRé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
CodeRelationEffet d’une modification de b
b = aDeux noms pour un même objetModifie a
b = a[2:5]Vue issue d’une tranche qui partage les donnéesModifie la partie correspondante de a
b = a[2:5].copy()Données indépendantesLaisse 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_memory pour 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.where choisit des valeurs à chaque position.
  • Utilise np.isnan pour repérer les NaN.
3

Remodeler, 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érationEffet sur r
r.reshape(3, 2)Lit les valeurs ligne par ligne et les regroupe
r.TPermute 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 -1 peut ê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.
  • flatten copie les données ; ravel et 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]) :

ExpressionFormeDisposition
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_stack pour 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_split autorise des morceaux de longueurs inégales.
  • Rassemble d’abord les lots, puis assemble-les en une seule fois.
4

Remplacer 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
FonctionRègleRésultat pour −2,5
np.floorVers l’infini négatif−3,0
np.ceilVers l’infini positif−2,0
np.truncVers zéro−2,0
np.roundAu 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.
  • maximum compare les positions ; max ré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.
5

Calculer 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érationType de résultat
sum, prodTotal ou produit
meanMoyenne arithmétique
min, maxValeur extrême
argmin, argmaxPosition 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 axis désigne l’axe réduit.
  • Sans axe, un seul indicateur est calculé sur tout le tableau.
  • argmin et argmax renvoient des positions, dont la première en cas d’ex æquo.
  • keepdims=True conserve les axes réduits avec une longueur de 1.
  • Les fonctions cumulées conservent les résultats intermédiaires.
  • NumPy utilise ddof=0 par défaut ; ddof=1 sé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.sort copie les données ; la méthode .sort() d’un tableau le modifie et renvoie None.
  • Utilise les positions de argsort pour conserver l’alignement des enregistrements et des tableaux associés.
  • unique(..., return_counts=True) associe les valeurs distinctes à leurs effectifs.
  • isin construit 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.
6

Gé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
AppelSignification
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, scale est l’écart-type, et non la variance.
  • choice échantillonne avec remise par défaut.
  • shuffle modifie le tableau ; permutation renvoie 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 :

p(1−p)n

Ici, p est la probabilité de l’événement et n 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 argmax pour 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

6 Leçons Interactives

1

Construire un tableau de mesures fiable

14 étapes
Créer et examiner un tableau, choisir ses valeurs initiales et conserver correctement les décimales et les données manquantes.
  1. 1
    IntroductionPlanifier 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 np en haut du script. Le nom np donne accès aux fonctions NumPy utilisées dans les exemples.

  2. 2
    ExplicationLire 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.shape vaut (2, 3), a.ndim vaut 2 et a.size vaut 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.

  3. 3
    Point 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.

  4. 4
    DéfiPrévoir une multiplication avant de l’exécuter

    Quels sont les résultats de [2, 5] * 2 et de np.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.

  5. 5
    ExempleRé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’affectation rain[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.

  6. 6
    ConseilChoisir délibérément le remplissage initial

    Utilise zeros lorsque des zéros initiaux ont un sens, ones pour des uns et full(shape, value) pour une autre valeur répétée. Leurs noms décrivent le contenu initial.

    empty ne 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.

  7. 7
    ExplicationCompter 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 de arange inattendues ; utilise linspace lorsque le nombre de points est imposé.

  8. 8
    Dé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.

  9. 9
    ExplicationExaminer 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.dtype lorsque les valeurs ne se comportent pas comme prévu. a.itemsize indique le nombre d’octets de stockage par élément ; le multiplier par a.size donne a.nbytes, le nombre total d’octets occupés par les éléments.

  10. 10
    ExempleObserver une affectation qui supprime les décimales

    Pars de counts = np.array([2, 4, 6]), puis exécute counts[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). astype cré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.

  11. 11
    Point 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.round arrondit 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 uint8 ne 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.

  12. 12
    Dé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 affecte a[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.

  13. 13
    Dé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.

  14. 14
    RécapitulatifExaminer la structure avant de calculer

    Pour le prochain tableau que tu crées, examine shape, size et dtype avant 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.

2

Sélectionner des enregistrements et maîtriser les effets des modifications

16 étapes
Utiliser des indices, des copies et des masques booléens pour sélectionner et mettre à jour les données numériques voulues.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDéterminer quelles valeurs doivent figurer dans le résultat
  2. 2
    ExplicationSuivre le début, la fin et le pas
  3. 3
    ExempleSélectionner des lignes et des colonnes en une expression
  4. 4
    DéfiConserver un axe de colonne
  5. 5
    ExempleSuivre une écriture à travers une vue
  6. 6
    ConseilRendre l’indépendance explicite
  7. 7
    ExplicationApparier des coordonnées ou choisir un bloc
  8. 8
    DéfiDistinguer une copie d’une affectation directe
  9. 9
    ExplicationTransformer une condition en sélection
  10. 10
    ExempleCombiner les bornes d’un intervalle
  11. 11
    Point cléCompter les événements ou calculer la moyenne de leurs valeurs
  12. 12
    ExempleChoisir entre remplacement et filtrage
  13. 13
    DéfiConserver les lignes complètes
  14. 14
    ConseilRepérer NaN sans test d’égalité
  15. 15
    DéfiModifier indépendamment les enregistrements sélectionnés
  16. 16
    RécapitulatifVérifier la cible de chaque modification
3

Donner aux valeurs la forme et le regroupement appropriés

12 étapes
Remodeler une séquence, permuter ses axes, puis assembler et découper des tableaux associés en préservant leur structure.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionRendre le regroupement visible dans la forme
  2. 2
    ExempleRegrouper des valeurs consécutives en périodes
  3. 3
    ExplicationDéduire une dimension manquante
  4. 4
    ExemplePermuter le sens des lignes et des colonnes
  5. 5
    DéfiCréer une colonne à partir d’un vecteur
  6. 6
    ConseilChoisir l’aplatissement en pensant aux modifications
  7. 7
    ExplicationProlonger un axe existant
  8. 8
    ExempleAjouter plutôt un axe de lots
  9. 9
    DéfiCréer deux colonnes de mesures
  10. 10
    ExempleDécouper selon des bornes ou un nombre de parties
  11. 11
    DéfiReconstituer une table à partir de lots de lignes
  12. 12
    RécapitulatifLire les formes comme des choix sur les données
4

Calculer sur les enregistrements sans boucle Python

15 étapes
Utiliser des expressions élément par élément, des fonctions adaptées aux tableaux et la diffusion pour calculer des résultats appariés et regroupés.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionLaisser l’expression décrire le calcul
  2. 2
    ExempleMultiplier les valeurs appariées et calculer leur total
  3. 3
    ExplicationUtiliser le bon opérateur de produit
  4. 4
    ConseilVérifier la destination et le dénominateur
  5. 5
    DéfiChoisir la référence d’une variation en pourcentage
  6. 6
    ExplicationAppliquer des fonctions mathématiques aux tableaux
  7. 7
    ExempleCalculer des distances par étapes
  8. 8
    DéfiComparer maximum et réduction
  9. 9
    ConseilExaminer les arrondis et les valeurs invalides
  10. 10
    ExplicationAligner les formes par leur extrémité droite
  11. 11
    ExempleConserver les moyennes des lignes sous forme de colonne
  12. 12
    Point cléUne diffusion valide peut répondre à la mauvaise question
  13. 13
    DéfiPrévoir le résultat d’une diffusion
  14. 14
    DéfiPondérer des mesures centrées
  15. 15
    RécapitulatifVérifier les valeurs, les appariements et la forme de sortie
5

Calculer des indicateurs sur les observations qui répondent à ta question

15 étapes
Choisir les axes de réduction, trier des enregistrements complets et traiter explicitement les valeurs manquantes et les sous-ensembles filtrés.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionChoisir la question avant la statistique
  2. 2
    ExempleRéduire l’axe des mesures
  3. 3
    Point cléSuivre ce qui reste après la réduction
  4. 4
    ExempleDistinguer position, valeur et somme cumulée
  5. 5
    DéfiChoisir le diviseur de la variance
  6. 6
    ExempleRepérer une médiane et un centile
  7. 7
    ConseilTrier les enregistrements à partir des positions
  8. 8
    DéfiRetrouver une étiquette à partir de son effectif
  9. 9
    ExplicationIgnorer volontairement les valeurs manquantes
  10. 10
    ExempleConvertir un code de valeur manquante avant de calculer la moyenne
  11. 11
    Point cléLe remplacement crée des observations pour le calcul
  12. 12
    ExempleDéterminer si chaque ligne est complète
  13. 13
    DéfiReconnaître un sous-ensemble vide
  14. 14
    DéfiCalculer des indicateurs et comparer les groupes
  15. 15
    RécapitulatifIndiquer ce qui a contribué à chaque indicateur
6

Réaliser une simulation reproductible, des tirages aux résultats

14 étapes
Créer un objet Generator, organiser les épreuves, estimer la probabilité d’un événement et examiner des trajectoires de marches aléatoires.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDonner une forme claire à chaque épreuve simulée
  2. 2
    ExplicationCréer l’objet Generator une seule fois
  3. 3
    ExempleDéfinir les paramètres des tirages entiers et normaux
  4. 4
    DéfiRepérer le bogue qui répète les tirages aléatoires
  5. 5
    ConseilChoisir la remise et préserver les enregistrements
  6. 6
    ExempleEstimer un événement avec un masque
  7. 7
    ExempleRéduire les valeurs de chaque épreuve à deux dés
  8. 8
    DéfiChercher l’événement sur au moins un dé
  9. 9
    ExplicationPrévoir la variabilité d’échantillonnage
  10. 10
    ExempleCumuler les pas pour former une trajectoire
  11. 11
    ConseilVérifier que la borne a été atteinte
  12. 12
    DéfiRépartir chaque enregistrement une seule fois
  13. 13
    DéfiDéterminer ce qu’une exécution beaucoup plus grande peut corriger
  14. 14
    RécapitulatifVérifier le modèle puis sa précision

Tableaux NumPy et calcul vectorisé : QCM

50 Questions Pratiques en 5 séries

Série 1 : Relier sélections, formes et indicateurs10 Questions Pratiques

Question 1 sur 10

Que crée np.arange(4, 16, 5) ?
  1. [4, 9, 14, 16]
  2. [4, 8, 12]
  3. [0, 5, 10, 15]
  4. [4, 9, 14]
Afficher la réponseMasquer la réponse
Réponse : D
La suite commence à 4 et ajoute 5, ce qui donne 4, 9 et 14 avant que la valeur suivante dépasse la borne de fin. La borne 16 est exclue et n’est pas ajoutée à la fin. Commencer à zéro reviendrait à ignorer la valeur de départ 4, fournie explicitement.

Question 2 sur 10

Après 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 ?
  1. [1, 1, 1]
  2. [1.8, 1.8, 1.8]
  3. [2, 2, 2]
  4. [2, 4, 6]
Afficher la réponseMasquer la réponse
Réponse : A
La fonction like hérite du type entier de 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

Que vaut a après a = np.arange(7); b = a[1:5]; c = a[[1, 4]]; b[1] = 90; c[0] = 80 ?
  1. [0, 80, 90, 3, 4, 5, 6]
  2. [0, 1, 2, 3, 4, 5, 6]
  3. [0, 1, 90, 3, 4, 5, 6]
  4. [0, 90, 2, 3, 80, 5, 6]
Afficher la réponseMasquer la réponse
Réponse : C
La tranche 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

Pour a = np.array([3, 6, 9, 12, 15, 18, 21]), quelles valeurs a[1:6:2] sélectionne-t-il ?
  1. [6, 12, 18, 21]
  2. [6, 12, 18]
  3. [3, 9, 15]
  4. [6, 9, 12, 15, 18]
Afficher la réponseMasquer la réponse
Réponse : B
Pars de l’indice 1 et avance de deux positions pour sélectionner les indices 1, 3 et 5. Leurs valeurs sont 6, 12 et 18. L’indice 6 correspond à la borne de fin exclue, donc 21 n’est pas inclus ; un pas de 2 saute les éléments intermédiaires au lieu de prendre toutes les valeurs de l’intervalle.

Question 5 sur 10

Les tableaux a et b ont pour formes (3, 2) et (3, 5). Quelle est la forme de np.concatenate([a, b], axis=1) ?
  1. (6, 5)
  2. (3, 2, 5)
  3. (3, 7)
  4. (2, 3, 5)
Afficher la réponseMasquer la réponse
Réponse : C
La concaténation selon l’axe 1 prolonge les colonnes, en additionnant 2 et 5 tout en conservant les trois lignes correspondantes. Le résultat est (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

Pour x = np.array([-3.5, 2.5]), que donne np.floor(x) - np.trunc(x) ?
  1. [-1., 0.]
  2. [0., 0.]
  3. [1., 0.]
  4. [-1., -1.]
Afficher la réponseMasquer la réponse
Réponse : A
La partie entière inférieure donne [-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

Pour les vecteurs de déplacement 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 ?
  1. [10., 17.]
  2. [14.]
  3. [10., 12.]
  4. [10.]
Afficher la réponseMasquer la réponse
Réponse : D
Calcule les distances à partir des coordonnées appariées avec 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

Pour x = np.array([10., np.nan, 16., np.nan, 22.]), quelle est la moyenne après remplacement de chaque NaN par zéro ?
  1. 16.0
  2. 9.6
  3. 12.0
  4. 19.2
Afficher la réponseMasquer la réponse
Réponse : B
Le remplacement par zéro laisse cinq éléments dont le total est 48 : la moyenne devient donc 48 divisé par 5, soit 9,6. La moyenne des valeurs observées est de 16,0 car elle ne divise que par les trois mesures présentes. Le remplacement par zéro modifie le dénominateur sans ajouter de mesures observées au total.

Question 9 sur 10

Que se passe-t-il lors de l’appel à rng.choice(np.arange(5), size=6, replace=False) ?
  1. Il renvoie six tirages en autorisant la répétition d’une position.
  2. Il renvoie cinq tirages après avoir réduit la taille demandée.
  3. Il renvoie six valeurs entières distinctes de 0 à 5.
  4. Il déclenche une erreur car six positions distinctes ne sont pas disponibles.
Afficher la réponseMasquer la réponse
Réponse : D
Un échantillonnage sans remise ne peut pas sélectionner plus de positions d’entrée distinctes que les cinq disponibles. La taille demandée de six déclenche donc 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 ?
  1. (dice == 6).any(axis=1).mean()
  2. (dice == 6).all(axis=1).mean()
  3. (dice == 6).mean(axis=1).mean()
  4. (dice == 6).any(axis=0).mean()
Afficher la réponseMasquer la réponse
Réponse : A
Repère d’abord les six, puis utilise 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

Un tableau contient 8 enregistrements avec 5 mesures par enregistrement, à raison d’un enregistrement par ligne. Quelle est sa forme ?
  1. (5, 8)
  2. (40,)
  3. (8, 5)
  4. (8, 5, 40)
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Tu as besoin de sept positions régulièrement espacées de 0 m à 3 m, les deux bornes incluses. Quel appel les crée ?
  1. np.arange(0, 3, 0.5)
  2. np.linspace(0, 3, 7)
  3. np.linspace(0, 3, 6)
  4. np.arange(0, 3, 7)
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Quelles valeurs résultent de np.array([4.9, -4.9]).astype(int) ?
  1. [4, -4]
  2. [5, -5]
  3. [4, -5]
  4. [5, -4]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Pour v = np.array([2, 8, 11, 5, 14]), quelle proportion (v >= 8).mean() renvoie-t-il ?
  1. 3.0
  2. 0.4
  3. 11.0
  4. 0.6
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Une table comporte des lignes [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 ?
  1. 5.5
  2. 7.0
  3. 8.0
  4. 4.0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Que vaut np.arange(8).reshape(2, 4).T[1] ?
  1. [2, 3]
  2. [4, 5, 6, 7]
  3. [0, 4]
  4. [1, 5]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Les anciens prix unitaires sont np.array([5., 8.]) et les nouveaux prix sont np.array([6., 6.]). Quelles variations en pourcentage (new - old) / old * 100 donne-t-il ?
  1. [20., -25.]
  2. [16.67, -33.33]
  3. [1., -2.]
  4. [-20., 25.]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une table comporte une ligne par machine et une colonne par jour. Quelle expression donne un total par machine ?
  1. data.sum(axis=0)
  2. data.sum()
  3. data.sum(axis=1)
  4. data.cumsum(axis=1)
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Une table d’enregistrements est définie par 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 ?
  1. np.sort(d, axis=0)
  2. d[d[:, 0].argsort()]
  3. d[d[:, 1].argsort()]
  4. np.sort(d, axis=1)
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Un générateur doit tirer 20 faces de dé possibles, les six faces étant toutes disponibles. Quel appel utilise les bonnes bornes entières ?
  1. rng.integers(1, 6, size=20)
  2. rng.integers(0, 6, size=20)
  3. rng.integers(1, 7, size=20)
  4. rng.integers(1, 7, size=6)
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

Quel est le résultat de a = np.array([8, 12]); a[0] = 3.7; b = a / 2 ?
  1. a vaut [3.7, 12.] ; b vaut [1.85, 6.].
  2. a vaut [3, 12] ; b vaut [1.5, 6.].
  3. a vaut [4, 12] ; b vaut [2., 6.].
  4. a vaut [3, 12] ; b vaut [1, 6].
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Pour m = np.arange(20).reshape(4, 5), quelles sont la forme et les valeurs de m[1:3, 2:3] ?
  1. (2,), avec les valeurs [7, 12]
  2. (2, 2), avec les lignes [7, 8] et [12, 13]
  3. (1, 2), avec la ligne [7, 12]
  4. (2, 1), avec les lignes [7] et [12]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Pour un tableau t de forme (3, 4, 5), quelle est la forme de t[1, :, 2:4] ?
  1. (4, 2)
  2. (1, 4, 2)
  3. (4,)
  4. (2, 4)
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Les mesures horaires 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 ?
  1. [1, 2, 3, 4]
  2. [1, 5, 9]
  3. [1, 4, 7, 10]
  4. [3, 6, 9, 12]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Quelles longueurs de morceaux np.array_split(np.arange(14), 4) produit-il ?
  1. 4, 4, 3, 3
  2. 3, 3, 4, 4
  3. 4, 4, 4, 2
  4. 3, 3, 3, 5
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Pour A = np.array([[2, 3], [4, 5]]), que renvoie A * A ?
  1. [[16, 21], [28, 37]]
  2. [[4, 6], [8, 10]]
  3. [[2, 3], [4, 5], [2, 3], [4, 5]]
  4. [[4, 9], [16, 25]]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Les lignes de 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 ?
  1. [[-2., 2.], [-2., 2.]]
  2. [[-3., -3.], [3., 3.]]
  3. [[-2., -4.], [4., 2.]]
  4. [[-5., -1.], [1., 5.]]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Pour x = np.array([1., 3., 5.]), que vaut x.var(ddof=1) ?
  1. 2.6667
  2. 4.0
  3. 2.0
  4. 8.0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Avec l’interpolation par défaut de NumPy, que vaut np.percentile([4, 8, 12, 20], 25) ?
  1. 6.0
  2. 8.0
  3. 7.0
  4. 10.0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Chaque ligne de 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 ?
  1. (np.abs(steps.cumsum(axis=1)) >= 3).any(axis=1).mean()
  2. (np.abs(steps.cumsum(axis=0)) >= 3).any(axis=1).mean()
  3. (np.abs(steps.sum(axis=1)) >= 3).mean()
  4. (np.abs(steps.cumsum(axis=1)) >= 3).all(axis=1).mean()
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

Un tableau numérique 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 ?
  1. 48
  2. 72
  3. 192
  4. 24
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Que produit np.array([4, 7]) * 3 ?
  1. [4, 7, 4, 7, 4, 7]
  2. [7, 10]
  3. [12, 21]
  4. [4, 7, 3]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Pour m = np.arange(12).reshape(3, 4), que vaut m[[0, 2], [1, 3]] ?
  1. [[1, 3], [9, 11]]
  2. [1, 3]
  3. [[4, 5, 6, 7], [8, 9, 10, 11]]
  4. [1, 11]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Les lignes [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 ?
  1. np.mean(d[d[:, 0] == 1, 1])
  2. np.nanmean(d[d[:, 0] == 1, 1])
  3. np.nanmean(d[d[:, 1] == 1, 0])
  4. np.nanmean(d[:, 1])
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Après v = np.arange(5), quelles sont respectivement les formes de v.T.shape et de v[:, np.newaxis].shape ?
  1. (1, 5) et (5, 1)
  2. (5,) et (5, 1)
  3. (5, 1) et (1, 5)
  4. (5,) et (1, 5)
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Pour x = np.array([-4., 2., 7.]), que produit np.maximum(x, 3) ?
  1. [3., 3., 3.]
  2. [-4., 2., 3.]
  3. [7., 7., 7.]
  4. [3., 3., 7.]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Une table de forme (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 ?
  1. X + offset[:, None], de forme (3, 2)
  2. X + offset, de forme (3, 2)
  3. X[:, :, None] + offset, de forme (3, 2, 3)
  4. X.T + offset[:, None], de forme (2, 3)
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()] ?
  1. 3
  2. 2
  3. 9
  4. 4
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Pour D = np.array([[2., 4.], [np.nan, 6.], [8., np.nan]]), que renvoie np.nanmean(D, axis=0) ?
  1. [3.3333, 3.3333]
  2. [3., 6., 8.]
  3. [np.nan, np.nan]
  4. [5., 5.]
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 ?
  1. Générer une permutation d’indices, la découper en 4 et 2, puis appliquer les deux tranches aux deux tableaux.
  2. Mélanger séparément les tableaux d’identifiants et de mesures, puis prendre leurs 4 premiers et 2 derniers éléments.
  3. Tirer 4 indices d’entraînement et 2 indices de test par des appels séparés, tous deux sans remise.
  4. Générer une permutation pour les identifiants et une autre pour les mesures, puis découper chacune en 4 et 2.
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

Un vecteur entier brut est 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 ?
  1. 7.0
  2. 5.0
  3. -327.8333
  4. 7.5
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 ?
  1. [20, 20, 8, 30]
  2. [5, 20, 8, 30]
  3. [5, 5, 8, 30]
  4. [5, 20, 8, 11]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Pour x = np.array([1., np.nan, 4., 7.]), tu veux la proportion de valeurs observées qui dépassent 3. Quelle est cette proportion ?
  1. 2/3
  2. 1/2
  3. 3/4
  4. 1/3
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Deux tableaux ont pour forme (2, 3). Quelle forme résulte de np.stack([a, b], axis=1) ?
  1. (4, 3)
  2. (2, 6)
  3. (2, 2, 3)
  4. (2, 3, 2)
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Après 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 ?
  1. La première expression arrondit en entiers ; la mise à jour en place exige des opérandes entiers.
  2. La première diffuse un scalaire ; la mise à jour en place exige un tableau de même forme.
  3. La première crée un stockage flottant ; la mise à jour en place conserve le stockage entier.
  4. La première ignore les règles de type ; la mise à jour en place exige des types identiques.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Le tableau 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 ?
  1. [[-4., 0., 4.], [-4., 0., 4.]]
  2. [[-1., -1., -1.], [1., 1., 1.]]
  3. [[-6., -2., 2.], [-2., 2., 6.]]
  4. [[-4., -1., 2.], [-2., 1., 4.]]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Chaque ligne de 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 ?
  1. [0., 0., 0.]
  2. [7.5, 6.5, 5.]
  3. [-1.5, -0.5, 1.]
  4. [1.5, 0.5, -1.]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Pour x = np.array([7, 12, 12, 4]), que vaut x.argmax() ?
  1. 12
  2. 1
  3. 2
  4. 3
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Les lignes [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 ?
  1. 7.3333
  2. 7.0
  3. 6.5
  4. 4.4
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Une simulation utilise des épreuves indépendantes pour estimer une proportion. Si 2 500 épreuves donnent une erreur-type d’environ 0,01, combien d’épreuves faut-il pour obtenir environ 0,0025 avec la même probabilité de l’événement ?
  1. 10 000
  2. 20 000
  3. 160 000
  4. 40 000
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

82 Mots-Clés, chacun avec sa définition

A

affectation par indexation
Une affectation par indexation écrit des valeurs aux positions sélectionnées d’un tableau existant, en appliquant les règles de type de données et de forme de la destination.
La ligne data[:2, 0] = 0 remplace les valeurs de la première colonne dans les deux premières lignes de la table.
agrégation
Une agrégation, ou réduction, combine les valeurs d’un tableau pour obtenir moins de résultats, par exemple un total, une moyenne, un minimum ou un maximum pour un groupe choisi.
L’appel table.mean(axis=0) combine les enregistrements pour donner une moyenne par colonne de mesures.
agrégation ignorant les NaN
Une agrégation ignorant les NaN saute volontairement les éléments NaN lors du calcul d’une statistique, à l’aide de fonctions telles que nanmean ou nanmedian.
np.nanmean([5., np.nan, 9.]) renvoie 7,0 en calculant la moyenne des deux valeurs observées.
aliasage
L’aliasage se produit lorsque différents noms désignent le même objet ; affecter un tableau à un autre nom ne copie pas ses données et ne crée pas d’objet vue.
Après 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
L’aplatissement dispose les valeurs d’un tableau sur une seule dimension ; flatten copie les données, tandis que ravel peut partager les données d’origine.
Appelle table.flatten() lorsque tu as besoin d’un résultat distinct à 1 dimension dont les modifications ne peuvent pas changer la table.
argmax
Argmax est une opération qui renvoie la position d’indice d’un maximum, en prenant la première occurrence lorsque plusieurs valeurs sont égales au maximum.
Pour [3, 8, 8, 2], argmax renvoie 1, qui est une position et non la valeur maximale 8.
axe
Un axe est une dimension d’un tableau, avec sa propre longueur et ses positions d’indices ; une table à 2 dimensions possède un axe de lignes et un axe de colonnes.
Dans une table de mesures, la sélection data[:, 0] conserve toutes les positions sur l’axe des lignes et prend la première colonne.
axe de réduction
Un axe de réduction est la dimension combinée par une agrégation ; il disparaît de la forme de sortie sauf s’il est conservé avec keepdims.
Réduire l’axe 1 de la forme (6, 4) laisse la forme (6,), avec un résultat par ligne d’origine.
axe singleton
Un axe singleton a une longueur de un et peut donner à un vecteur le rôle d’une ligne ou d’une colonne sans changer le nombre de valeurs du tableau.
Ajouter [:, 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
Un calcul élément par élément applique un opérateur aux positions correspondantes de tableaux compatibles et produit un résultat pour chaque paire alignée.
Multiplier deux tableaux (2, 3) avec * donne six produits appariés dans un autre tableau (2, 3).
centile
Un centile décrit une position dans une distribution triée sur une échelle de 0 à 100 ; NumPy effectue par défaut une interpolation linéaire.
Le 50e centile correspond à la médiane, tandis que les 25e et 75e centiles marquent les positions des quartiles.
centrage
Le centrage soustrait la moyenne pertinente des valeurs afin de mesurer les écarts par rapport à la moyenne de la ligne, de la colonne ou du groupe sélectionné.
X - X.mean(axis=0) soustrait la moyenne de chaque colonne aux valeurs de cette même colonne.
centrage et réduction
Le centrage et la réduction consistent à soustraire une moyenne puis à diviser par l’écart-type correspondant, non nul, pour exprimer les valeurs en unités de cet écart-type.
(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
Un code de valeur manquante est une valeur convenue qui signale des observations absentes et doit être reconnue avant qu’elle ne soit traitée comme une donnée numérique.
Remplace un code défini comme −999 par NaN dans un tableau à virgule flottante avant de calculer la moyenne des mesures.
concaténation
La concaténation assemble des tableaux selon un axe existant ; elle exige que les longueurs de tous les autres axes correspondent et additionne les longueurs sur l’axe d’assemblage.
Assembler des tableaux de formes (2, 4) et (5, 4) selon l’axe 0 crée une table de sept lignes et quatre colonnes.
conversion de type
La conversion de type représente des valeurs avec un autre type de données ; astype renvoie une copie convertie et certaines conversions suppriment des informations.
L’appel 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
Les coordonnées appariées sont des positions de ligne et de colonne associées élément par élément à partir de tableaux d’indices ; elles sélectionnent un élément pour chaque paire correspondante.
L’expression 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
Une copie est un tableau dont les éléments disposent d’un stockage indépendant, ce qui permet de modifier ses valeurs sans changer celles du tableau source.
Conserver 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é
Une correction des degrés de liberté fixe, par l’intermédiaire de ddof, la quantité soustraite du nombre de valeurs dans le diviseur d’une variance ou d’un écart-type.
Pour cinq observations et ddof=1, NumPy divise la somme des carrés des écarts par quatre.

D

découpage
Le découpage divise un tableau selon un axe à l’aide de positions de coupe ou d’un nombre de parties demandé ; array_split autorise des parties de longueurs inégales.
Découper 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
Un dépassement de capacité des entiers se produit lorsqu’un résultat arithmétique dépasse la plage d’un type entier de taille fixe, ce qui peut provoquer un bouclage dans les calculs sur les tableaux.
Additionner deux tableaux uint8 contenant 250 et 10 donne 4 par bouclage, car ce type ne peut pas contenir 260.
diffusion
La diffusion aligne des formes de tableaux compatibles afin que les axes de longueur un s’étendent conceptuellement pendant les opérations élément par élément, sans copier les entrées répétées.
Ajouter un vecteur de forme (3,) à une table de forme (8, 3) applique ce vecteur à chacune des huit lignes.
dimensions compatibles
Les dimensions compatibles ont des longueurs égales ou comprennent une longueur de un lorsque les formes sont alignées à partir de leurs axes les plus à droite pour la diffusion.
Les formes (5, 1) et (4,) se combinent en (5, 4) car leurs axes alignés respectent la règle de compatibilité.

E

empilement
L’empilement assemble des tableaux de même forme selon un nouvel axe dont la longueur est égale au nombre de tableaux fournis, augmentant le nombre de dimensions de un.
Empiler trois vecteurs de longueur cinq selon l’axe 0 crée la forme (3, 5), avec un vecteur fourni par ligne.
empilement en colonnes
L’empilement en colonnes place des tableaux correspondants à 1 dimension dans les colonnes d’une table à 2 dimensions, en conservant les valeurs de même indice d’origine sur la même ligne.
Combine des vecteurs alignés de tailles et de masses avec np.column_stack pour créer un enregistrement de deux mesures par personne.
ensemble de définition
L’ensemble de définition d’une fonction est l’ensemble des entrées pour lesquelles sa règle mathématique est définie dans l’ensemble de nombres utilisé.
Une racine carrée réelle exige une entrée positive ou nulle ; np.sqrt(-4.0) émet normalement un avertissement et renvoie NaN.
erreur-type
Une erreur-type décrit la variabilité d’échantillonnage d’une estimation entre des exécutions indépendantes répétées ; elle diminue lorsque la racine carrée du nombre d’épreuves augmente.
Pour une probabilité d’événement fixe, faire passer le nombre d’épreuves de simulation de 100 à 400 divise approximativement par deux l’erreur-type de la proportion.
espacement linéaire
Un espacement linéaire signifie que les écarts entre points voisins sont égaux sur un intervalle ; linspace crée cette grille à partir de ses bornes et du nombre de points.
Cinq points linéairement espacés de 0 m à 8 m forment quatre intervalles de 2 m chacun.

É

écart-type
L’écart-type mesure la dispersion autour de la moyenne comme la racine carrée de la variance, dans la même unité que les mesures d’origine.
Pour des données de température, std() utilise par défaut le diviseur N ; ddof=1 sélectionne la formule d’échantillon.
échantillonnage avec remise
L’échantillonnage avec remise permet de sélectionner plusieurs fois la même position d’entrée ; c’est le comportement par défaut de rng.choice.
Un échantillon de cinq tirages parmi trois étiquettes peut répéter une étiquette, car chaque tirage peut revenir à une position antérieure.
écrêtage
L’écrêtage limite les valeurs à un intervalle donné en remplaçant celles qui sont inférieures à la borne basse ou supérieures à la borne haute par ces bornes.
np.clip(readings, 10, 30) conserve les valeurs intérieures et remplace les mesures hors de cet intervalle par 10 ou 30.
épreuve
Une épreuve est une répétition d’une expérience simulée, comprenant toutes les valeurs générées nécessaires pour déterminer son résultat.
Lorsqu’une ligne contient trois lancers de pièce, une réduction sur cette ligne évalue une épreuve avant que les résultats soient combinés.

F

fonction de création de tableaux
Une fonction de création de tableaux construit un tableau à partir de valeurs fournies ou d’une règle précisant sa forme, son remplissage, sa plage ou son nombre de points.
np.full((3, 2), 8) crée trois lignes de deux valeurs sans avoir à écrire six entrées séparées.
fonction universelle
Une fonction universelle, ou ufunc, applique une opération numérique élément par élément à des tableaux et accepte des formes d’entrée compatibles.
np.sqrt(distances_squared) calcule une racine carrée à chaque position sans utiliser la fonction scalaire Python math.sqrt.
fonction universelle binaire
Une fonction universelle binaire prend deux entrées et les combine élément par élément, par exemple pour sélectionner le maximum de chaque paire ou multiplier des valeurs.
np.maximum(observed, minimum) choisit la plus grande de deux valeurs alignées à chaque position de sortie.
fonction universelle unaire
Une fonction universelle unaire prend une entrée et applique sa règle numérique à chaque élément, comme pour la valeur absolue, le logarithme ou la racine carrée.
Appeler np.abs sur un vecteur d’erreurs signées produit un vecteur contenant leurs valeurs absolues.
forme
La forme d’un tableau est le tuple des longueurs de ses axes dans l’ordre ; elle décrit la disposition des éléments et non simplement leur nombre.
La forme (2, 6) décrit deux lignes de six valeurs, tandis que la forme (12,) décrit un vecteur de douze valeurs.

G

Generator
Un Generator est l’objet d’échantillonnage aléatoire de NumPy, créé avec default_rng et réutilisé au moyen de méthodes qui font évoluer son état interne.
Appeler rng.integers deux fois poursuit la suite ; recréer rng avec la même graine la redémarre.
graine
Une graine fournit les informations qui initialisent l’état d’un générateur aléatoire, ce qui permet de reproduire sa suite ultérieure de tirages.
Créer np.random.default_rng(17) au début donne un point de départ reproductible pour l’analyse.

I

imputation par la moyenne
L’imputation par la moyenne remplace les éléments manquants par la moyenne observée, ce qui conserve cette moyenne tout en donnant aux valeurs complétées une dispersion apparente plus faible.
Remplacer les NaN d’un capteur par sa moyenne observée modifie la dispersion même si la moyenne indiquée reste fixe.
indexation avancée
L’indexation avancée sélectionne des positions à l’aide de listes ou de tableaux d’entiers, en autorisant un ordre quelconque et des répétitions tout en renvoyant des données copiées.
La sélection a[[4, 1, 4]] inclut deux fois la position 4 et conserve l’ordre demandé en sortie.
indexation booléenne
L’indexation booléenne sélectionne les éléments ou les enregistrements pour lesquels un masque correspondant est vrai et produit des copies des valeurs aux positions sélectionnées.
data[data[:, 0] > 10] conserve des lignes entières selon la condition appliquée à leur première colonne.
indice
Un indice est une position utilisée pour sélectionner un élément d’un tableau selon un axe ; les positions commencent à zéro et les indices négatifs comptent à rebours depuis la fin.
Pour cinq mesures, l’indice 4 et l’indice −1 désignent tous deux la dernière mesure selon cet axe.
infini
L’infini est une valeur à virgule flottante représentant un résultat numérique non borné, écrite inf ou -inf et détectée comme non finie.
Diviser des éléments positifs à virgule flottante par zéro produit normalement inf avec un avertissement selon les réglages NumPy par défaut.

L

ligne complète
Une ligne complète ne contient aucune valeur manquante parmi ses champs ; un test des valeurs manquantes par ligne permet de repérer les enregistrements qui respectent cette condition.
~np.isnan(data).any(axis=1) crée un élément vrai pour chaque enregistrement complet d’une table numérique.
loi normale
Une loi normale est un modèle symétrique en forme de cloche défini par une moyenne et un écart-type, dans lequel on peut effectuer des tirages avec rng.normal.
Un appel avec 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
Une marche aléatoire construit une trajectoire en cumulant des pas aléatoires, chaque somme cumulée donnant la position après le pas correspondant.
Simuler des déplacements de ±1 et appliquer cumsum(axis=1) crée des positions de marche distinctes sur chaque ligne d’épreuve.
masque booléen
Un masque booléen est un tableau de valeurs vrai ou faux qui indique les positions remplissant une condition ; il sert à filtrer, compter ou affecter des valeurs sélectionnées.
Pour un vecteur de températures, t > 25 repère les jours où la température enregistrée dépasse 25 °C.
matrice identité
Une matrice identité est un tableau carré à 2 dimensions comportant des uns sur sa diagonale principale et des zéros ailleurs ; elle est créée par une fonction comme 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
La médiane est la valeur centrale des données triées, ou la moyenne des deux valeurs centrales lorsque l’effectif est pair ; elle est donc peu sensible aux observations extrêmes.
La médiane de [1, 3, 6, 100] est de 4,5, même si la dernière valeur exceptionnellement grande augmente fortement la moyenne.

N

NaN
NaN, qui signifie « pas un nombre », est un marqueur à virgule flottante utilisé pour les valeurs manquantes et certains résultats invalides ; il est différent même de lui-même.
Les valeurs [4.0, np.nan, 8.0] nécessitent un stockage à virgule flottante, et np.isnan repère la position manquante.
ndarray
Un ndarray est l’objet tableau de NumPy : une collection rectangulaire d’éléments disposés selon zéro ou plusieurs axes et partageant un seul type de données.
Une table de 50 enregistrements et trois mesures par enregistrement peut être représentée par un ndarray de forme (50, 3).
nombre à virgule flottante
Un nombre à virgule flottante stocke une approximation binaire de précision finie d’une valeur numérique : de nombreuses fractions décimales ne sont donc pas représentées exactement.
Compare les tableaux décimaux calculés avec np.allclose lorsque de minuscules différences de représentation doivent être tolérées.

O

opération en place
Une opération en place modifie le stockage d’un tableau existant et conserve son type de données ; certains types de résultats ne peuvent donc pas être réécrits par cette opération.
Ajouter 0,5 avec += à 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
Une opération logique élément par élément combine les éléments correspondants de masques avec &, | ou ~ pour exprimer respectivement ET, OU ou la négation.
Le masque (x >= 2) & (x <= 8) conserve les valeurs respectant les deux bornes, chaque comparaison étant entre parenthèses.
ordre par lignes
L’ordre par lignes parcourt un tableau en faisant varier le dernier indice le plus rapidement, et lit toutes les valeurs d’une ligne avant de passer à la suivante.
Le remodelage par défaut de [0, 1, 2, 3, 4, 5] en (2, 3) place [0, 1, 2] dans la première ligne.

P

partage de mémoire
Le partage de mémoire signifie que des tableaux font référence à des données stockées qui se chevauchent ; np.shares_memory vérifie si deux tableaux donnés se chevauchent.
Une sélection copiée par indexation avancée ne partage pas sa mémoire avec sa source, contrairement à une tranche ordinaire non vide.
partie entière inférieure
La partie entière inférieure d’un nombre réel est le plus grand entier qui lui est inférieur ou égal ; np.floor applique cet arrondi vers le bas à chaque valeur fournie.
Pour −2,3, np.floor donne −3,0 car −2 serait supérieur à la valeur négative d’origine.
partie entière supérieure
La partie entière supérieure d’un nombre réel est le plus petit entier qui lui est supérieur ou égal ; np.ceil applique cet arrondi vers le haut aux valeurs d’un tableau.
Pour −2,3, np.ceil donne −2,0, tandis que pour 2,3 il donne 3,0.
pas
Un pas est la différence voulue entre deux valeurs successives d’une suite générée ; il est précisé par le troisième argument de np.arange.
np.arange(2, 15, 4) utilise un pas de 4 pour créer la suite [2 6 10 14].
permutation
Une permutation réorganise toutes les positions d’entrée sans en omettre ni en répéter, ce qui permet d’obtenir des copies mélangées et des indices aléatoires d’enregistrements.
Découpe une seule permutation rng.permutation(n) en tranches d’indices disjointes pour affecter chaque enregistrement à exactement un sous-ensemble.

Q

quantile
Un quantile décrit une position dans une distribution à l’aide d’une fraction de 0 à 1, correspondant à un centile divisé par 100.
np.quantile(x, 0.75) demande la même position que np.percentile(x, 75) avec des options identiques.

R

remodelage
Un remodelage réorganise un tableau selon une nouvelle structure d’axes tout en conservant son nombre d’éléments ; par défaut, il lit les valeurs ligne par ligne.
Douze valeurs mensuelles consécutives sont remodelées en (4, 3) lorsqu’une ligne doit contenir les trois mois de chaque trimestre.

S

sélecteur entier
Un sélecteur entier choisit une position sur un axe et supprime cet axe du résultat, contrairement à une tranche couvrant une seule position.
Pour une table de forme (8, 3), data[:, 1] renvoie la forme (8,) après suppression de l’axe des colonnes.
sélection conditionnelle
La sélection conditionnelle avec 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
Une simulation utilise un modèle et des épreuves générées répétées pour estimer des résultats tels qu’une probabilité d’événement ou une moyenne à long terme.
Tirer une table comportant deux colonnes de dés par épreuve permet d’estimer la fréquence de sommes choisies de deux dés.
somme cumulée
Une somme cumulée enregistre le total jusqu’à chaque position et conserve les totaux intermédiaires au lieu de renvoyer uniquement une somme finale.
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
Une somme pondérée additionne des valeurs après avoir multiplié chacune par le coefficient qui lui est attribué, ce qui permet aux colonnes de contribuer différemment.
(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
Une statistique conditionnelle est calculée uniquement sur les valeurs sélectionnées par une condition ou une étiquette, à l’aide d’un masque qui repère les enregistrements à prendre en compte.
mass[batch == 'B'].mean() calcule la moyenne des seules masses dont l’étiquette de lot correspondante est B.
stockage homogène
Le stockage homogène signifie que chaque élément d’un tableau suit le même type de données, ce qui permet de traiter les valeurs numériques selon des règles de stockage cohérentes.
Dans 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
Une suite pseudo-aléatoire est produite par un algorithme déterministe, mais conçue pour se comporter comme des tirages aléatoires dans des tâches telles que l’échantillonnage et la simulation.
Répéter une analyse initialisée par une graine peut reproduire la suite de tirages lorsque les appels et l’environnement numérique restent identiques.

T

tableau non initialisé
Un tableau non initialisé dispose d’un espace de stockage alloué dont les valeurs initiales n’ont pas été définies pour être utilisées ; il faut donc les affecter avant de les lire.
Utilise np.empty(100) uniquement lorsque le code ultérieur remplira chaque élément avant qu’un calcul ne l’utilise.
taille
La taille d’un tableau est son nombre total d’éléments, égal au produit des longueurs de sa forme pour un tableau ayant un ou plusieurs axes.
Un tableau de forme (4, 7) a une taille de 28 même si son attribut ndim ne signale que deux axes.
temps de premier passage
Un temps de premier passage est le nombre de pas nécessaires pour qu’une trajectoire remplisse une condition donnée pour la première fois ; il faut vérifier que ce passage a effectivement eu lieu.
Si le masque de passage d’une marche devient vrai pour la première fois à l’indice 6, la borne a été atteinte après sept pas.
tranche
Une tranche sélectionne une suite régulière de positions à l’aide d’un début, d’une fin exclue et d’un pas facultatif, tout en conservant l’axe sélectionné.
La tranche a[2:7:2] sélectionne les positions 2, 4 et 6, en sautant une position entre les valeurs sélectionnées.
transposition
Une transposition modifie l’ordre des axes ; dans un tableau à 2 dimensions, elle permute les rôles des lignes et des colonnes tout en conservant la relation de chaque valeur avec ses axes d’origine.
Transposer une table de forme (2, 5) donne la forme (5, 2), chaque ancienne colonne devenant une ligne.
tri indirect
Le tri indirect renvoie les positions d’indices qui placeraient les valeurs dans l’ordre trié, permettant d’appliquer le même ordre à d’autres données.
Utilise names[np.argsort(scores)] pour lister les noms dans l’ordre des scores sans perdre l’association entre noms et scores.
troncature
La troncature supprime la partie fractionnaire d’un nombre vers zéro : une valeur positive diminue et une valeur négative augmente vers zéro.
Convertir −7,9 avec astype(int) donne −7 ; appliquer floor donnerait −8.
type de données
Un type de données décrit la nature et la représentation en mémoire de chaque élément d’un tableau, notamment la taille des nombres, comme 32 ou 64 bits.
Examiner 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
Les valeurs distinctes sont les différentes valeurs présentes dans un tableau ; np.unique les renvoie triées et peut aussi renvoyer leurs nombres d’occurrences correspondants.
Une étiquette répétée apparaît une fois dans la sortie des valeurs distinctes, son effectif étant stocké à la position correspondante.
vectorisation
La vectorisation exprime des calculs numériques répétés sous forme d’opérations sur des tableaux entiers, en laissant NumPy effectuer le travail sur les éléments dans du code compilé.
L’expression price * quantity calcule chaque total de ligne sans boucle Python distincte sur les articles.
vue
Une vue est un objet tableau qui partage un tampon de données existant : modifier ses éléments change donc les valeurs stockées correspondantes dans sa source.
Après b = a[1:4], l’affectation b[0] = 50 modifie a[1] car la tranche simple partage les données.

À propos de cette unité

Par StudeliSignaler une erreur

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.

Commencer