NumPy

bibliothèque logicielle Python

NumPy
Logo.
Image illustrative de l’article NumPy

Date de première version Voir et modifier les données sur Wikidata
Développeur communauté[pas clair]
Dernière version 1.26.4 ()[1]Voir et modifier les données sur Wikidata
Écrit en Python, C et FortranVoir et modifier les données sur Wikidata
Système d'exploitation Multiplate-forme
Licence BSD 3-clauses[2]Voir et modifier les données sur Wikidata
Site web numpy.orgVoir et modifier les données sur Wikidata

NumPy est une bibliothèque pour langage de programmation Python, destinée à manipuler des matrices ou tableaux multidimensionnels ainsi que des fonctions mathématiques opérant sur ces tableaux.

Plus précisément, cette bibliothèque logicielle libre et open source fournit de multiples fonctions permettant notamment de créer directement un tableau depuis un fichier ou au contraire de sauvegarder un tableau dans un fichier, et manipuler des vecteurs, matrices et polynômes.

NumPy est la base de SciPy, regroupement de bibliothèques Python autour du calcul scientifique[3].

Historique modifier

Le langage de programmation Python n'a pas été conçu à l'origine pour le calcul numérique. Cependant, il a très tôt attiré l'attention de la communauté scientifique et technique.

En 1995, le groupe d'intérêt spécial (SIG) matrix-sig a été fondé dans le but de définir un paquetage de calcul matriciel. Parmi ses membres, Guido van Rossum, concepteur et développeur de Python, a étendu sa syntaxe, et en particulier, la syntaxe d'indexation, afin de faciliter le calcul des tableaux. Une première implémentation d'un paquetage matriciel a été réalisée par Jim Fulton, puis amélioré par Jim Hugunin et appelée Numeric, également connu sous le nom de "Numerical Python extensions" ou "NumPy".

Hugunin, un étudiant diplômé du Massachusetts Institute of Technology (MIT) a rejoint la Corporation for National Research Initiatives (CNRI) en 1997 pour travailler sur JPython, laissant Paul Dubois du Laboratoire National Lawrence Livermore (LLNL) prendre la relève de la maintenance. Parmi les autres premiers contributeurs, citons David Ascher, Konrad Hinsen et Travis Oliphant.

Un nouveau paquet appelé Numarray a été écrit pour remplacer Numeric de manière plus flexible. Mais, comme Numeric, il est désormais obsolète. Ses opérations étaient plus rapides que Numeric pour les grands tableaux, mais plus lent pour les petits. Ainsi, pendant un certain temps, les deux paquets ont été utilisés en parallèle pour différents cas d'utilisation. La dernière version de Numeric (v24.2) a été publiée le 11 novembre 2005, tandis que la dernière version de numarray (v1.5.2) a été publiée le 24 août 2006.

Il semblait nécessaire d'intégrer Numeric dans la bibliothèque standard de Python, mais Guido van Rossum a décidé que le code n'était pas maintenable en l'état.

Au début de l'année 2005, Travis Oliphant, développeur de NumPy, a voulu unifier la communauté autour d'un seul package de tableaux et a porté les fonctionnalités de Numarray vers Numeric, publiant le résultat sous le nom de NumPy 1.0 en 2006. Ce nouveau projet faisait partie de SciPy.

Afin de ne pas installer la totalité de la librairie SciPy à seul fin d'accèder à un objet tableau, ce nouveau paquet a été séparé et appelé NumPy.

La version 1.5.0 de NumPy en 2011 a pris en charge Python 3. Le développement d'une implémentation de l'API NumPy pour PyPy a démarré mais n'est pas encore totalement compatible.

Fonctionnalités modifier

NumPy cible l'implémentation de référence CPython de Python, interpréteur non optimisé de bytecode. Les algorithmes mathématiques écrits pour cette version de Python sont souvent beaucoup plus lents que leurs équivalents qui ont été compilés. NumPy résout le problème de la lenteur en partie en fournissant des tableaux multidimensionnels avec les fonctions et opérateurs qui travaillent efficacement sur ces tableaux. Leur utilisation nécessite la réécriture d'une partie du code source, et notamment, les boucles internes.

L'utilisation de NumPy dans Python offre des fonctionnalités comparables à celles de MATLAB car ils sont tous deux interprétés. Ils permettent tous deux à l'utilisateur d'écrire des programmes rapides en réalisant des opérations sur des tableaux ou des matrices à la place de scalaires. MATLAB dispose d'un grand nombre de boîtes à outils supplémentaires telles que Simulink. NumPy, quant à lui, est intrinsèquement intégré à Python, langage de programmation plus récent et complet. De plus, des librairies Python complémentaires sont disponibles.

Par exemple, SciPy est une bibliothèque qui ajoute des fonctionnalités similaires à celles de MATLAB. Matplotlib, est une autre bibliothèque qui fournit des fonctionnalités de représentation graphique de type MATLAB. Enfin, NumPy s'appuie sur BLAS et LAPACK pour effectuer des calculs efficaces d'algèbre linéaire.

Les objets Python de la bibliothèque de vision par ordinateur OpenCV, largement utilisée, utilisent des tableaux NumPy pour stocker et traiter les données. Comme les images sont simplement représentées sous forme de tableaux tridimensionnels, l'indexation, le découpage ou le masquage avec d'autres tableaux sont des moyens très efficaces d'accéder à des pixels spécifiques de cette image.

Un tableau NumPy, structure de données universelle dans OpenCV, simplifie la programmation et le débogage pour les images, les informations extraites, les noyaux ...,

Exemples modifier

Création de tableau modifier

Numpy apporte la structure de données ndarray (Tableaux multidimensionnels) à python. Contrairement a la structure de liste de python, cette structure n'est pas dynamique, et le type de ses éléments doit être homogène[4].

>>> import numpy as np
>>> x = np.array([1, 2, 3])
>>> x
array([1, 2, 3])
>>> y = np.arange(10)
>>> y
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Opérations de base modifier

>>> a = np.array([1, 2, 3, 6])
>>> b = np.linspace(0, 2, 4)
>>> c = a - b
>>> c
array([ 1.        ,  1.33333333,  1.66666667,  4.        ])
>>> a**2
array([ 1,  4,  9, 36])

Fonctions universelles modifier

>>> a = np.linspace(-np.pi, np.pi, 100) 
>>> b = np.sin(a)
>>> c = np.cos(a)

Algèbre linéaire modifier

>>> from numpy.random import rand
>>> from numpy.linalg import solve, inv
>>> a = np.array([[1, 2, 3], [3, 4, 6.7], [5, 9.0, 5]])
>>> a.transpose()
array([[ 1. ,  3. ,  5. ],
       [ 2. ,  4. ,  9. ],
       [ 3. ,  6.7,  5. ]])
>>> inv(a)
array([[-2.27683616,  0.96045198,  0.07909605],
       [ 1.04519774, -0.56497175,  0.1299435 ],
       [ 0.39548023,  0.05649718, -0.11299435]])
>>> b =  np.array([3, 2, 1])
>>> solve(a, b)  # résout ax = b
array([-4.83050847,  2.13559322,  1.18644068])
>>> c = rand(3, 3)  # crée une matrice 3x3 au hasard
>>> c
array([[  3.98732789,   2.47702609,   4.71167924],
       [  9.24410671,   5.5240412 ,  10.6468792 ],
       [ 10.38136661,   8.44968437,  15.17639591]])
>>> np.dot(a, c)  # multiplication de matrices
array([[  53.61964114,   38.8741616 ,   71.53462537],
       [ 118.4935668 ,   86.14012835,  158.40440712],
       [ 155.04043289,  104.3499231 ,  195.26228855]])
>>> a @ c  # depuis Python 3.5 et NumPy 1.10, équivalent à np.dot(a, c) 
array([[  53.61964114,   38.8741616 ,   71.53462537],
       [ 118.4935668 ,   86.14012835,  158.40440712],
       [ 155.04043289,  104.3499231 ,  195.26228855]])

Tensors modifier

>>> M = np.zeros(shape=(2, 3, 5, 7, 11))
>>> T = np.transpose(M, (4, 2, 1, 3, 0))
>>> T.shape
(11, 5, 3, 7, 2)

Notes et références modifier

  1. a et b « Tags » (consulté le )
  2. « https://github.com/numpy/numpy/blob/master/LICENSE.txt » (consulté le )
  3. « Scientific computing tools for Python — SciPy.org », sur www.scipy.org (consulté le )
  4. Stefan Van Der Walt, S. Chris Colbert et Gaël Varoquaux, « The NumPy array: a structure for efficient numerical computation », Computing in Science & Engineering, vol. 13, no 2,‎ , p. 22–30 (ISSN 1521-9615, DOI 10.1109/MCSE.2011.37, lire en ligne, consulté le )

Voir aussi modifier

  • SciPy : librairie pour le calcul scientifique.

Liens externes modifier

Sur les autres projets Wikimedia :