D’innombrables données sont collectées en permanence par des outils de mesure de toutes sortes, et le problème d’exploiter de tels réservoirs d’information se pose quotidiennement. Qu’il s’agisse de recommander un achat précis sur une boutique en ligne en se fondant sur l’historique de millions d’internautes ou bien d’agréger les données issues de capteurs météo, la bibliothèque NumPy s’est peu à peu imposée comme l’outil privilégié des analystes…


au sommaire


    L’un des atouts de Python réside dans la présence d’un vaste ensemble de bibliothèques associées à ce langage de programmation. La communauté de développeurs qui s’est formée autour de Python amène à profiter des apports des uns et des autres et il en résulte des écosystèmes d’une incroyable richesse. Originellement dédiée au calcul scientifique mais exploitée bien au-delà du monde de la recherche, NumPy est un bon exemple d’outil savamment pensé qui conserve néanmoins l’accessibilité propre à Python.

    Qu'est-ce que NumPy ?

    NumPy est une bibliothèque du langage de programmation Python, dédiée au calcul sur des tableaux (en anglais, arrays), soit de vastes volumes de chiffres. Cette bibliothèque propose des représentations « standard » de données numériques tabulées.

    Les structures de données de Python

    Par nature, Python fournit de riches outils de structures de données :

    • les « tuples », c'est-à-dire des séquences d’éléments hétérogènes immuables (on ne peut les mettre à jour) ;
    • les ensembles (sets) qui sont des collections non ordonnées d’objets uniques et immuables ;
    • les listes pour énumérer des collections d’objets ordonnées ;
    • les intervalles (range), ce sont des séquences avec une valeur d’arrivée obligatoire et qui peuvent aussi intégrer une valeur de départ et une valeur de pas ;
    • des dictionnaires où l’on s’associe des clés (keys) uniques et immuables à des valeurs (values) susceptibles d’évoluer...

    Il reste que de telles structures ne sont pas idéales pour les calculs à haute performance. NumPy a donc été créé dans un tel but : faciliter les opérations rapides sur des tableaux volumineux.

    Comment NumPy a-t-il été créé ?

    C’est un chercheur américain, Travis Oliphant, qui a créé NumPy au début des années 2000, avec pour objectif de définir une structure de données facilitant le calcul sur les tableaux.

    L’ambition de Oliphant était de pouvoir marier deux bibliothèques de calcul apparues auparavant : 

    • Numeric, qui avait été créé en 1995, proposait déjà de pouvoir manipuler des tableaux de chiffres en Python. Numeric avait été créé par plusieurs développeurs parmi lesquels le programmeur Jim Hugunin, mais aussi Konrad Hinsen, un chercheur du CNRS ;
    • Numarray (2001), qui était l’œuvre de trois chercheurs du Space Telescope Science Institute, une organisation fondée par la Nasa : Peter Greenfield, Rick White et Todd Miller. Leur ambition était d’aider à analyser les vastes volumes de données transmises par le télescope spatial Hubble.

    Numeric avait été codé en langage C à des fins d’efficacité, alors que Numarray avait été écrit intégralement en Python. Il en a résulté que Numarray, bien que plus aisé à gérer, opérait plus lentement que Numeric. De ce fait, il existait une tension entre les partisans de ces deux approches dans le monde scientifique.

    Durant un atelier collaboratif, les développeurs de Numeric et Numarray se sont posé la question : pourrait-on disposer d’une seule bibliothèque qui embrasserait ces deux modèles et même les surpasserait ?

    Travis Oliphant, un jeune professeur d’une université de l’Utah, a entrepris la tâche colossale consistant à réaliser une telle bibliothèque, qu'il a baptisée NumPy, au risque de compromettre sa carrière universitaire. NumPy a été écrit en partie en Python. Toutefois, certains éléments nécessitant un calcul fort rapide ont été écrits en C ou en C++.

    NumPy a été prêt en 2005. À l’arrivée, il y avait de quoi être surpris à la fois par le nombre de fonctions proposées par NumPy mais aussi par la flexibilité de ses outils, notamment si l’on utilise une interface telle que Jupiter notebook, et enfin par la rapidité d’opération. Travis Oliphant a entrepris un travail de conviction afin que son outil soit largement adopté par la communauté scientifique Python – ce qui impliquait pour les intéressés d’adapter les programmes développés en Numeric ou Numarray.

    Et donc, NumPy s’est peu à peu imposé comme le standard pour ce qui est des calculs sur des tableaux. La bibliothèque NumPy est intégralement open source et accessible à n’importe quel développeur Python depuis le site numpy.org.

    Travis Oliphant, le créateur de NumPy, auteur du livre <em>The Definitive Guide to NumPy</em>, et P.-D.G. de Continuum Analytics. © SIG
    Travis Oliphant, le créateur de NumPy, auteur du livre The Definitive Guide to NumPy, et P.-D.G. de Continuum Analytics. © SIG

    Un modèle de gestion de la mémoire

    Gaël Varoquaux, directeur de Recherche à l’Inria, explique ainsi ce qui fait la spécificité de NumPy : « L’une des raisons pour lesquelles NumPy a eu autant de succès est qu’il correspond à une manière bien définie d’accéder à la mémoire et qu’il permet de partager la mémoire entre divers outils numériques sans avoir à se soucier de la gestion de cette mémoire. » En d’autres termes, avec NumPy, la mémoire peut être manipulée pour du calcul numérique, sans avoir à gérer des interrogations telles que « où se trouve une portion de mémoire particulière », « laquelle vient d’être libérée », « laquelle n’est pas libre » ou « quel bout de mémoire correspond à quoi », etc.

    « Python agit ainsi à la base pour les objets qu’il manipule, et Numpy applique cette approche à de grands tableaux de chiffres que l’on peut transmettre à des librairies scientifiques. Pour prendre une analogie : si je donne un numéro de téléphone d’une personne à quelqu’un d’autre, je ne transfère pas la personne, mais son adresse. De même, l’idée d’un outil tel que NumPy n’est pas de copier une information mais de transférer des pointeurs relatifs à des valeurs », reprend Gaël Varoquaux.

    Comment fonctionne NumPy ?

    Le package NumPy se compose de :

    • la structure de tableau (array) de NumPy connue sous le nom de tableau Numpy à N dimensions ;
    • des opérations mathématiques associées : exponentielle, sinus, outils statistiques... ;
    • des fonctions de manipulation des éléments d’un tableau.

    Un tableau NumPy est un ensemble multidimensionnel d’éléments réguliers. Il est caractérisé d’une part, par le type d’éléments contenus.

    Un tableau NumPy peut contenir toutes sortes d’éléments : dates, booléens, nombres complexes… Toutefois, chaque tableau ne peut contenir qu’un seul et même type d’élément. Par exemple, nous pourrions avoir un tableau de 10 000 nombres flottants à 32 bits, et nous saurions donc dès le départ quel est l’espace mémoire exact utilisé.

    Un tableau NumPy peut avoir n’importe quelle dimension, mais celle-ci doit être clairement spécifiée. Ainsi, dans le cas du tableau de 10 000 nombres précédemment évoqué, la forme pourrait être 10 lignes x 1 000 colonnes, 20 x 500, 100 x 100…

    Un autre élément important qu’il faut définir est l’incrément (stride, en anglais) qui permet de passer d’un chiffre à l’autre. Retenons qu’un tableau NumPy est décrit par deux attributs principaux :

    • forme (shape) : la forme de l’array. Par exemple, (8,8) définit un tableau à deux dimensions de 8 lignes et 8 colonnes. (4, 4, 4) définirait un tableau tridimensionnel ;
    • pas (stride) : le nombre d’octets qu’il faut « sauter » (passer) en mémoire pour accéder à l’élément suivant. Par exemple, dans un tableau (8,8) le stride serait de (8,1), soit 8 octets pour atteindre la ligne suivante et 1 octet pour atteindre la colonne suivante.

    Fondamentalement, nous pourrions dire qu’un tableau NumPy décrit un ou plusieurs blocs de données stockés dans une mémoire informatique. Il en résulte une manipulation extrêmement simple des éléments d'un tableau, et la possibilité d'appliquer des opérations numériques à leur égard.

    Le code est simple d’usage comme le montre cet exemple où l’on élève au carré une série de nombres :

    >>> import numpy

    >>> a = numpy array ([2, 4, 6, 8])

    >>> a**2

    array ([4, 16, 36, 64])

    Tableaux et matrices

    En réalité, NumPy a introduit deux nouveaux types de données dans Python :

    • les tableaux (arrays) qui peuvent avoir toutes sortes de dimensions ;
    • les matrices qui ont la forme de tableaux mais n’ont que deux dimensions et vont bénéficier des mathématiques propres au calcul matriciel,  soit l’algèbre linéaire.

    Pour mémoire, l’algèbre linéaire opère sur des concepts de lignes, de plans, d’espaces vectoriels… Et donc, si vous vous posez la question : peut-on utiliser Numpy pour manipuler des matrices, la réponse est oui : NumPy propose la structure np.matrix et sait gérer l’algèbre linéaire relative aux matrices.

    À quoi sert NumPy ?

    Nous l’avons vu, NumPy sert au calcul numérique. Et comme on trouve du calcul numérique sous les formes les plus diverses, NumPy est utilisé dans de très nombreux domaines. Les applications de NumPy sont innombrables et s’étendent du jeu vidéo à l’exploration spatiale. Elles incluent :

    • la manipulation d’images ;
    • l’analyse de big data ;
    • la météorologie ;
    • la prévision de trafic ;
    • les calculs de déformation physique de structures ;
    • les applications de climatologie ;
    • l’imagerie médicale...

    Qui s'en sert ?

    Grâce à l’étendue de ses fonctions, NumPy a été largement adoptée par la communauté scientifique, dans les laboratoires comme dans les académies. Comme NumPy dispose de nombreux modules de calcul scientifique, il a séduit les chercheurs de ce milieu et il s’est développé un véritable écosystème NumPy, notamment dans la recherche et les mathématiques expérimentales. Toutefois, NumPy est également mis à profit dans l’industrie. Il aide notamment à la simulation numérique de nouveaux produits et matériaux pouvant impliquer des paramètres physiques complexes. De nombreux sites Web recourent à NumPy pour les analyses de données. Ainsi, assez souvent, lorsqu’un site pratique des recommandations d’achat, les calculs numériques sous-jacents ont été réalisés grâce à NumPy.

    Quels sont les avantages et les inconvénients de NumPy ?

    L’avantage de NumPy est de permettre, dans la logique de Python, une approche interactive, qui rend son usage analogue à celui d’une calculatrice. Et à l’instar de Python, il produit un code propre, d’une bonne clarté y compris pour le non-initié, et facile à étendre.

    La question est souvent posée : si l’on souhaite procéder à des calculs mathématiques, pourquoi adopter NumPy plutôt que Pandas ? Pour faire simple, l’interface de Pandas est plus conviviale, mais NumPy est bien plus rapide, en particulier sur de vastes volumes de données.

    En revanche, NumPy n’est pas bien adaptée à la manipulation de données de types irréguliers. Si l’on est sensible à cet aspect, Pandas pourra sembler plus approprié. Un autre inconvénient de NumPy est qu’il n’est pas conçu pour fonctionner aisément sur des cartes graphiques (GPU), car celles-ci opèrent sur leurs propres mémoires. De ce fait, d’autres librairies similaires ont pris leur essor dans cet environnement, notamment Jax qu’a développé Google pour l’intelligence artificielle.

    Comment apprendre à s'en servir ?

    Peut-on envisager de lancer sa carrière de Data Scientist grâce à NumPy ? Tout à fait, si l’on est disposé à se former aux arcanes de ce langage. La communauté NumPy propose divers outils d’apprentissage. Le site numpy.org propose de prendre par la main le novice avec de très nombreuses initiations. On pourra également consulter le site Scipy Lectures Notes qui a l’avantage de couvrir aussi bien l’initiation à NumPy qu’à Python ou à d’autres bibliothèques telles que Matplotlib. Seul souci : ces diverses initiations sont en anglais. Toutefois, il existe diverses formations accessibles en français notamment sur YouTube.

    De nombreuses initiations à NumPy sont accessibles depuis le site numpy.org, notamment cette initiation visuelle. © Lev Maximov
    De nombreuses initiations à NumPy sont accessibles depuis le site numpy.org, notamment cette initiation visuelle. © Lev Maximov

    Travis Oliphant a lui-même réalisé un guide d’apprentissage de NumPy publié exclusivement sur Amazon, mais là encore uniquement en anglais et à un prix qui peut sembler excessif.

    Travis Oliphant a auto-édité ce guide de NumPy, uniquement disponible en anglais. © Amazon
    Travis Oliphant a auto-édité ce guide de NumPy, uniquement disponible en anglais. © Amazon

    Quels sont les outils similaires ?

    Avant l’apparition de NumPy, c’est le langage Fortran qui était prisé par la communauté scientifique et en dépit de son ancienneté et de sa difficulté d’apprentissage, il conserve une certaine popularité.

    De même, historiquement, c’est l’outil MATLAB qui a été particulièrement prisé en la matière. Il a été le premier à proposer un environnement de calcul de haut niveau et conserve une base d’utilisateurs importante. Il en est de même pour le logiciel Mathematica édité par Wolfram Research dès 1988.

    Dans l’univers Python, l’alternative essentielle est le langage Jax de Google, mais aussi Dask qui s’appuie sur NumPy et favorise les calculs hors mémoire pour des tableaux de taille particulièrement volumineuse.