Aller au contenu principal
ActivePapers Stockez vos données sous forme de documents recalculables : tout résultat publié peut ainsi être relancé, vérifié et préservé.

Certains liens de ce site sont des liens d'affiliation : si vous effectuez un achat via ceux-ci, nous pouvons percevoir une commission sans frais supplémentaires pour vous. Cela n'influence jamais nos recommandations. Consultez notre divulgation d'affiliation pour plus de détails. Divulgation d'affiliation.

NumPy pour les data scientists : un guide pratique

NumPy pour les data scientists est la bibliothèque Python de base pour le calcul numérique : elle fournit le ndarray, un bloc de mémoire contigu de type fixe qui prend en charge les opérations vectorisées sur N dimensions. NumPy est sorti en 2006 et est désormais disponible en version 2.x. Il sous-tend pandas, SciPy, scikit-learn et à peu près toutes les piles scientifiques Python que vous toucherez.

Points clés à retenir

  • Le ndarray est une vue typée et à pas (strided) sur un tampon contigu — la compréhension des foulées et des dtypes explique la plupart des surprises en termes de performances et de mémoire que vous rencontrerez lors de l’utilisation de NumPy pour les data scientists.
  • La vectorisation bat les boucles Python d’un à deux ordres de grandeur dans les charges de travail numériques typiques, mais uniquement lorsque l’opération est mappée sur les noyaux compilés de NumPy.
  • La diffusion est un ensemble de règles d’alignement, pas magiques : les dimensions sont comparées de droite à gauche et doivent être égales ou 1.
  • NumPy 2.0 a modifié le type entier par défaut sous Windows et renforcé les règles de promotion, de sorte que le code qui fonctionnait silencieusement sur 1.26 puisse changer de type ou lever une exception sur 2.x.
  • Pour le travail tabulaire, pandas est généralement le bon couche ; NumPy est la couche idéale pour les tableaux, l’algèbre linéaire, le traitement du signal et le noyau numérique des pipelines personnalisés.
  • La disposition de la mémoire (ordre C par rapport à l’ordre Fortran) et la sémantique copie/vue décident si une matrice de 10 Go tient dans la RAM ou double silencieusement.

Qu’est-ce que NumPy dans la science des données, précisément ?

Pour une approche numpy pour data scientist, il est préférable de le comprendre comme le substrat du tableau situé sous le reste de la pile. Lorsque vous appelez pandas.DataFrame.to_numpy(), entraînez un estimateur scikit-learn ou lisez un morceau d’un fichier HDF5 avec h5py, les données atterrissent dans un ndarray. Ce type d’objet unique – un type, une forme, une mémoire tampon – est ce qui rend les bibliothèques en aval rapides et prévisibles.

La portée de la bibliothèque est plus étroite que ce à quoi s’attendent les nouveaux arrivants. NumPy n’effectue pas de données étiquetées, de sémantique des valeurs manquantes ou d’agrégation groupée ; les pandas le font. NumPy ne fait pas d’optimisation, d’interpolation ou d’algèbre linéaire clairsemée ; SciPy le fait. NumPy réalise des tableaux denses à N dimensions, des mathématiques par éléments, de la diffusion, des réductions, de l’indexation, de la génération de nombres aléatoires et une interface d’algèbre linéaire avec BLAS et LAPACK. Savoir où se situe cette limite évite l’erreur courante de réimplémenter les pandas dans NumPy.

Le ndarray : trois attributs qui expliquent tout

Un ndarray est décrit par trois éléments : shape, dtype et strides. La forme est la dimensionnalité logique. Dtype corrige l’interprétation de chaque élément — float64, int32, complex128, datetime64[ns] ou un enregistrement structuré. Les foulées donnent le décalage d’octets par rapport au pas pour chaque axe.

Les strides sont la raison pour laquelle arr[::2] et arr.T sont gratuits. Le découpage avec un pas ou la transposition ne déplace pas les données ; il renvoie une nouvelle vue avec des foulées différentes sur le même tampon.

Remodeler un tableau contigu en C est également une vue. L’indexation sophistiquée (arr[[0, 5, 9]]) et le masquage booléen, en revanche, allouent toujours un nouveau tableau. Dans un pipeline qui traite des tableaux de plusieurs gigaoctets, la différence entre une vue et une copie est la différence entre le succès et le swapping.

Connexes : — Parcours de science des données basés sur des projets avec un terminal guidé et des ensembles de données réels.

Une habitude pratique pour utiliser numpy pour les tâches de data scientist : après toute opération d’indexation non triviale, vérifiez « arr.base is None » pour voir si vous possédez la mémoire, et « arr.flags[‘C_CONTIGUOUS’] » pour voir si la disposition correspond à ce qu’attend une routine C ou Fortran en aval. La propre documentation de NumPy sur la disposition de la mémoire interne est la référence faisant autorité ici.

Utilisation de NumPy dans la science des données : là où il gagne réellement sa place

Pour un workflow numpy pour data scientist, l’utilisation de NumPy se divise en cinq tâches récurrentes.

Prétraitement numérique à grande échelle. Les fonctionnalités de normalisation, les décomptes de transformation logarithmique, l’écrêtage des valeurs aberrantes et le calcul des distances par paires sont tous des opérations par éléments ou de réduction. Les faire sur un ndarray évite la surcharge Python par ligne.

Ça vaut le coup d'oeil : — Un abonnement pour les certificats Python et de science des données soutenus par l'université.

Algèbre linéaire. Moindres carrés, PCA via SVD, estimation de covariance et résolution de systèmes denses via numpy.linalg, qui appelle les mêmes bibliothèques BLAS/LAPACK que celles utilisées par MATLAB et R. Une build OpenBLAS ou MKL bien réglée peut être plusieurs fois plus rapide qu’une build naïve sur la même machine.

Simulation aléatoire. numpy.random.default_rng() (l’API Generator introduite dans NumPy 1.17) donne des flux reproductibles et statistiquement meilleurs que l’ancien RandomState. Le travail de Monte Carlo, le rééchantillonnage bootstrap et les tests de permutation se trouvent tous ici.

Interfaçage avec les formats binaires. Les fichiers bruts HDF5, NetCDF, Zarr et mappés en mémoire exposent tous des interfaces de type tableau. np.memmap vous permet de travailler sur un tableau plus grand que la RAM par pagination depuis le disque.

Colle entre les bibliothèques. La conversion entre pandas, PyTorch et xarray passe généralement par NumPy. Le protocole tampon signifie que ces conversions sont souvent sans copie.

NumPy est-il important pour la science des données ? La réponse honnête

NumPy est important pour un data scientist car il s’agit d’une dépendance, et non pas parce que c’est toujours l’interface sur laquelle vous écrivez. Un data scientist en activité peut passer des mois sans taper directement « importer numpy as np », mais chaque opération pandas, chaque ajustement scikit-learn et chaque tracé matplotlib exécute le code NumPy en dessous.

L’importance est structurelle. NumPy définit l’API de tableau sur laquelle le reste de l’écosystème s’accorde – une spécification désormais formalisée en tant que standard d’API Python Array, qui permet à des bibliothèques comme CuPy, JAX et PyTorch d’exposer des interfaces compatibles. Apprendre NumPy consiste donc moins à mémoriser des fonctions qu’à apprendre le modèle mental qui est transféré à chaque bibliothèque de tableaux que vous utiliserez par la suite.

Connexes : — Une bibliothèque technique approfondie de livres, de vidéos et de formations en informatique scientifique.

Où NumPy n’est pas la réponse : ETL lourd en chaînes, jointures entre tables hétérogènes, rééchantillonnage de séries chronologiques avec des horodatages irréguliers et tout ce qui nécessite une évaluation paresseuse sur des ensembles de données qui ne tiennent pas en mémoire. Recherchez des pandas, Polars, DuckDB ou Dask dans ces cas.

Vectorisation, diffusion et règles qui mordent

La diffusion compare les formes depuis la droite. Deux dimensions sont compatibles si elles sont égales ou si l’une d’elles vaut 1 ; la dimension taille 1 est étirée sans copie.

Une matrice de caractéristiques « (1000, 3) » moins un vecteur moyen « (3,) » fonctionne. Une matrice (1000, 3) moins un vecteur (1000,) lève une erreur, car les dimensions finales 3 et 1000 ne sont pas d’accord - et le correctif est presque toujours mean[:, None], pas une boucle. Il s’agit d’un concept critique dans numpy pour les flux de travail des data scientists.

Si vous faites du shopping : — Cours interactifs Python et science des données que vous codez directement dans le navigateur.

Trois modes de défaillance sont récurrents dans le code réel :

  1. Produits extérieurs accidentels. a[:, None] * b[None, :] sur deux vecteurs de 100 000 éléments alloue 10 ^ 10 flotteurs. Cela fait 80 Go chez float64. Coupez-le en morceaux ou utilisez une formulation qui réduit immédiatement.
  2. Dépassement d’entier. L’arithmétique np.int32 s’enroule silencieusement. La sommation de grands comptes dans int32 est une source classique de totaux négatifs.
  3. Opérations sur place sur les vues. arr[::2] += 1 modifie le tampon parent. C’est souvent ce que vous souhaitez et parfois un bug qui corrompt un tableau mis en cache.

Choisir le bon outil : NumPy contre les alternatives

TâcheMeilleur premier choixPourquoi
Données tabulaires étiquetées, jointures, groupbypandas ou PolarsAlignement d’index et sémantique des valeurs manquantes
Tableaux numériques denses, algèbre linéaireNumPyAccès direct BLAS/LAPACK, frais généraux minimes
Tableaux plus grands que la RAMDask, Zarr ou np.memmapExécution fragmentée ou paginée
Mathématiques des tableaux accélérés par GPUCuPy ou JAXAPI compatible NumPy, exécution d’appareil
Matrices clairseméesSciPy sparseLa mémoire évolue avec des valeurs différentes de zéro
Autodiff et JIT pour le code de rechercheJAXTransformations fonctionnelles sur les programmes array

La règle de décision : si vos données comportent des étiquettes de lignes significatives et des types de colonnes mixtes, commencez par les pandas. S’il s’agit d’un bloc numérique homogène et que vous vous souciez du débit, commencez par NumPy, l’outil numpy essentiel pour les data scientists. S’il ne rentre pas dans la mémoire, commencez avec un framework fragmenté et déposez-le dans NumPy à l’intérieur de chaque fragment.

Pratiques de performance qui font réellement bouger les choses

Faites correspondre le type au problème. float32 réduit de moitié la mémoire et peut doubler le débit sur le matériel avec des ratios FP32:FP64 de 2:1, au prix d’environ sept chiffres décimaux de précision. Pour les solveurs itératifs et les simulations longues, cette erreur s’accumule ; pour le prétraitement orienté affichage, cela convient généralement.

Préallouer et compléter. L’expansion des tableaux à l’aide de np.append dans une boucle réaffecte chaque itération. Attribuez la sortie une fois et attribuez-la par morceaux.

Utilisez out= pour éviter les temporaires. np.multiply(a, b, out=c) écrit dans la mémoire existante. Dans les boucles serrées sur de grands tableaux, cela supprime la pression d’allocation et améliore le comportement du cache.

Préférez les réductions à la matérialisation. np.einsum et np.dot expriment des contractions sans construire de tableaux intermédiaires. (a[:, None] * b[None, :]).sum(axis=1) et a * b.sum() calculent la même chose avec des profils de mémoire très différents.

Sachez quand quitter NumPy. Pour les fonctions élément par élément avec des branches, Numba ou Cython peuvent battre NumPy vectorisé car ils évitent complètement les tableaux temporaires. Pour tout ce qui comporte une boucle au niveau Python sur les lignes, c’est la boucle qui pose problème, pas NumPy.

NumPy 2.x : ce qui a changé et pourquoi c’est important

NumPy 2.0, publié en juin 2024, est la première version majeure depuis 2006. Trois changements affectent le code de fonctionnement de la communauté numpy pour les scientifiques des données.

Le type entier par défaut sous Windows est passé de « int32 » à « int64 », s’alignant sur Linux et macOS. NEP 50 a renforcé la promotion des types afin que les scalaires Python ne convertissent plus les tableaux de manière surprenante — np.float32(1) + 1.0 reste désormais float32. Et l’API C a été réorganisée, ce qui a rompu la compatibilité binaire : les extensions compilées avec 1.x doivent être reconstruites.

Pour la plupart des codes d’analyse, la migration se déroule sans incident, mais le code numérique qui reposait sur une conversion ascendante implicite peut modifier les résultats dans les derniers bits. Exécutez votre suite de tests sur 2.x avant de mettre à niveau un environnement de production et épinglez les versions dans des artefacts de recherche reproductibles. Les notes de version de NumPy documentent chaque modification.

Notes de reproductibilité pour les groupes de laboratoire

Le travail numérique reproductible pour un numpy pour data scientist dépend de plus qu’une graine. Enregistrez la version de NumPy, l’implémentation de BLAS (OpenBLAS, MKL et Accelerate donnent des résultats de dernier bit différents pour la même opération), le nombre de threads et le type de chaque tableau qui alimente une figure publiée. np.show_config() imprime les détails de la construction.

La sommation à virgule flottante n’est pas associative, donc les réductions parallèles peuvent différer d’une exécution à l’autre. Si un résultat doit être identique en bits, utilisez « np.sum » avec une sommation par paire sur un seul thread, ou utilisez explicitement la sommation Kahan. Pour les pipelines de laboratoire partagés, épinglez NumPy dans un fichier de verrouillage et stockez le fichier de verrouillage avec les données.

Sources et lectures complémentaires

  • Data science — Wikipédia : La science des données est un domaine académique interdisciplinaire qui utilise les statistiques, le calcul scientifique, les méthodes scientifiques, le traitement, la visualisation scientifique, les algorithmes…

Questions fréquemment posées

A quoi sert NumPy en science des données ?

NumPy fournit le tableau à N dimensions et les opérations vectorisées sur lesquelles sont construites la plupart des bibliothèques scientifiques Python. Les data scientists utilisent numpy pour les tâches de data scientist telles que le prétraitement numérique, l’algèbre linéaire, la simulation aléatoire et comme format d’échange entre pandas, scikit-learn, PyTorch et les bibliothèques de traçage. L’utilisation directe est courante dans les pipelines personnalisés ; l’usage indirect est universel.

NumPy est-il important pour la science des données si j’utilise principalement des pandas ?

Oui, car pandas stocke les colonnes numériques sous forme de tableaux NumPy et délègue ses calculs à NumPy. Comprendre les types, les vues par rapport aux copies et la diffusion explique la plupart des performances et du comportement de la mémoire des pandas. Vous pouvez être productif sans écrire directement NumPy, mais vous déboguerez plus rapidement si vous comprenez la couche située en dessous.

Dois-je d’abord apprendre NumPy ou les pandas ?

Apprenez d’abord NumPy si votre travail implique des simulations, des signaux, des images ou des algorithmes numériques personnalisés. Apprenez d’abord les pandas si votre travail consiste en une analyse tabulaire avec des colonnes étiquetées et des types mixtes. En pratique, quelques heures de NumPy — tableaux, indexation, diffusion, réductions — rendent immédiatement les pandas moins mystérieux.

Quelle est la vitesse de NumPy par rapport aux boucles Python pures ?

Les opérations NumPy vectorisées s’exécutent généralement un à deux ordres de grandeur plus rapidement que les boucles Python équivalentes sur les mêmes données, car la boucle interne s’exécute en C compilé sans surcharge d’interpréteur par élément. L’écart se rétrécit ou s’inverse lorsque l’opération ne peut pas être vectorisée, lorsque les tableaux sont suffisamment petits pour que la surcharge d’appel domine, ou lorsque la forme vectorisée alloue de grands temporaires.

NumPy gère-t-il les données manquantes ?

NumPy a np.nan pour les flotteurs et les tableaux masqués np.ma, mais ni l’un ni l’autre ne fournit une sémantique des valeurs manquantes de style pandas à travers les types. Depuis NumPy 1.24, np.nan n’est valable que pour les types flottants et complexes, et les tableaux d’entiers ne peuvent pas le contenir. Pour une véritable gestion des données manquantes, utilisez des types nullables pandas ou un framework dédié.

Qu’est-ce qui a changé dans NumPy 2.0 qui pourrait casser mon code ?

NumPy 2.0 a modifié l’entier par défaut de Windows en int64, a adopté les règles de promotion NEP 50 afin que les scalaires Python n’augmentent plus la précision des tableaux et a réorganisé l’API C, rompant la compatibilité binaire avec les extensions compilées pour la version 1.x. La plupart du code d’analyse fonctionne inchangé, mais le code numérique sensible à la promotion des types (dtype) doit être retesté.

Questions fréquentes

A quoi sert NumPy en science des données ?

NumPy fournit le tableau à N dimensions et les opérations vectorisées sur lesquelles sont construites la plupart des bibliothèques scientifiques Python. Les data scientists utilisent numpy pour les tâches de data scientist telles que le prétraitement numérique, l'algèbre linéaire, la simulation aléatoire et comme format d'échange entre pandas, scikit-learn, PyTorch et les bibliothèques de traçage. L'utilisation directe est courante dans les pipelines personnalisés ; l’usage indirect est universel.

NumPy est-il important pour la science des données si j'utilise principalement des pandas ?

Oui, car pandas stocke les colonnes numériques sous forme de tableaux NumPy et délègue ses calculs à NumPy. Comprendre les types, les vues par rapport aux copies et la diffusion explique la plupart des performances et du comportement de la mémoire des pandas. Vous pouvez être productif sans écrire directement NumPy, mais vous déboguerez plus rapidement si vous comprenez la couche située en dessous.

Dois-je d’abord apprendre NumPy ou les pandas ?

Apprenez d'abord NumPy si votre travail implique des simulations, des signaux, des images ou des algorithmes numériques personnalisés. Apprenez d'abord les pandas si votre travail consiste en une analyse tabulaire avec des colonnes étiquetées et des types mixtes. En pratique, quelques heures de NumPy — tableaux, indexation, diffusion, réductions — rendent immédiatement les pandas moins mystérieux.

Quelle est la vitesse de NumPy par rapport aux boucles Python pures ?

Les opérations NumPy vectorisées s'exécutent généralement un à deux ordres de grandeur plus rapidement que les boucles Python équivalentes sur les mêmes données, car la boucle interne s'exécute en C compilé sans surcharge d'interpréteur par élément. L'écart se rétrécit ou s'inverse lorsque l'opération ne peut pas être vectorisée, lorsque les tableaux sont suffisamment petits pour que la surcharge d'appel domine, ou lorsque la forme vectorisée alloue de grands temporaires.

NumPy gère-t-il les données manquantes ?

NumPy a np.nan pour les flotteurs et les tableaux masqués np.ma, mais ni l'un ni l'autre ne fournit une sémantique des valeurs manquantes de style pandas à travers les types. Depuis NumPy 1.24, np.nan n'est valide que pour les types flottants et complexes, et les tableaux d'entiers ne peuvent pas le contenir. Pour une véritable gestion des données manquantes, utilisez des types nullables pandas ou un framework dédié.

Qu'est-ce qui a changé dans NumPy 2.0 qui pourrait casser mon code ?

NumPy 2.0 a modifié l'entier par défaut de Windows en int64, a adopté les règles de promotion NEP 50 afin que les scalaires Python ne convertissent plus les tableaux et a réorganisé l'API C, rompant la compatibilité binaire avec les extensions construites avec 1.x. La plupart du code d'analyse fonctionne inchangé, mais le code numérique sensible à la promotion du type doit être retesté.


Apprenez Python en codant dans votre navigateur

Cours interactifs Python et science des données que vous codez directement dans le navigateur