NumPy - Python pour le calcul scientifique

publicité
NumPy
Python pour le calcul scientifique
Pierre Navaro
IRMAR
ENSAI le 23 mars 2016
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
1/1
Pourquoi utiliser numpy ?
Les listes Python sont très pratiques mais :
Les operations mathématiques entre listes de grande taille sont
lentes.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
2/1
Pourquoi utiliser numpy ?
Les listes Python sont très pratiques mais :
Les operations mathématiques entre listes de grande taille sont
lentes.
Elles ont une empreinte mémoire importante.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
2/1
Pourquoi utiliser numpy ?
Les listes Python sont très pratiques mais :
Les operations mathématiques entre listes de grande taille sont
lentes.
Elles ont une empreinte mémoire importante.
Pour les matrices, par exemple, vous avez besoin d’une liste de
listes...
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
2/1
Pourquoi utiliser numpy ?
Les listes Python sont très pratiques mais :
Les operations mathématiques entre listes de grande taille sont
lentes.
Elles ont une empreinte mémoire importante.
Pour les matrices, par exemple, vous avez besoin d’une liste de
listes...
>>> from random import random
>>> from operator import add
>>> import time
>>> n = 10000000
>>> l1 = [random() for i in range(n)]
>>> l2 = [random() for i in range(n)]
>>> start = time.clock()
>>> l3 = map(add, l1, l2)
>>> print time.clock() - start
1.65
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
2/1
Pourquoi utiliser numpy ?
Les listes Python sont très pratiques mais :
Les operations mathématiques entre listes de grande taille sont
lentes.
Elles ont une empreinte mémoire importante.
Pour les matrices, par exemple, vous avez besoin d’une liste de
listes...
>>> from random import random
>>> from operator import add
>>> import time
>>> n = 10000000
>>> l1 = [random() for i in range(n)]
>>> l2 = [random() for i in range(n)]
>>> start = time.clock()
>>> l3 = map(add, l1, l2)
>>> print time.clock() - start
1.65
Pierre Navaro (IRMAR)
>>>
>>>
>>>
>>>
>>>
>>>
0.1
NumPy
import numpy as np
a1 = np.array(l1)
a2 = np.array(l2)
start = time.clock()
a3 = a1+a2
print time.clock() - start
ENSAI le 23 mars 2016
2/1
NumPy
Le module incontournable du calcul scientifique avec Python.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
3/1
NumPy
Le module incontournable du calcul scientifique avec Python.
Héritier de Numeric et Numarray.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
3/1
NumPy
Le module incontournable du calcul scientifique avec Python.
Héritier de Numeric et Numarray.
Classes de base pour SciPy.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
3/1
NumPy
Le module incontournable du calcul scientifique avec Python.
Héritier de Numeric et Numarray.
Classes de base pour SciPy.
S’installe comme un module Python standard.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
3/1
NumPy
Le module incontournable du calcul scientifique avec Python.
Héritier de Numeric et Numarray.
Classes de base pour SciPy.
S’installe comme un module Python standard.
Contient les fonctions de manipulation des tableaux pour le
calcul numérique.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
3/1
NumPy
Le module incontournable du calcul scientifique avec Python.
Héritier de Numeric et Numarray.
Classes de base pour SciPy.
S’installe comme un module Python standard.
Contient les fonctions de manipulation des tableaux pour le
calcul numérique.
Bibliothèque mathématique importante.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
3/1
NumPy
Le module incontournable du calcul scientifique avec Python.
Héritier de Numeric et Numarray.
Classes de base pour SciPy.
S’installe comme un module Python standard.
Contient les fonctions de manipulation des tableaux pour le
calcul numérique.
Bibliothèque mathématique importante.
API pour l’encapsulation de codes Fortran, C/C++.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
3/1
Le tableau NumPy ndarray
Collection indexable et contigüe d’éléments de même type
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
4/1
Le tableau NumPy ndarray
Collection indexable et contigüe d’éléments de même type
Implémentation avec un vrai tableau en mémoire optimisé pour
les performances
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
4/1
Le tableau NumPy ndarray
Collection indexable et contigüe d’éléments de même type
Implémentation avec un vrai tableau en mémoire optimisé pour
les performances
Manipulation similaire à tout autre objet Python
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
4/1
Le tableau NumPy ndarray
Collection indexable et contigüe d’éléments de même type
Implémentation avec un vrai tableau en mémoire optimisé pour
les performances
Manipulation similaire à tout autre objet Python
Multi-dimensionnel pour tous les types de données
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
4/1
Le tableau NumPy ndarray
Collection indexable et contigüe d’éléments de même type
Implémentation avec un vrai tableau en mémoire optimisé pour
les performances
Manipulation similaire à tout autre objet Python
Multi-dimensionnel pour tous les types de données
Les dimensions et parcours sont modifiables, les indexations
souples
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
4/1
Le tableau NumPy ndarray
Collection indexable et contigüe d’éléments de même type
Implémentation avec un vrai tableau en mémoire optimisé pour
les performances
Manipulation similaire à tout autre objet Python
Multi-dimensionnel pour tous les types de données
Les dimensions et parcours sont modifiables, les indexations
souples
Permet l’encapsulation de tableaux fortran.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
4/1
Le tableau NumPy ndarray
Collection indexable et contigüe d’éléments de même type
Implémentation avec un vrai tableau en mémoire optimisé pour
les performances
Manipulation similaire à tout autre objet Python
Multi-dimensionnel pour tous les types de données
Les dimensions et parcours sont modifiables, les indexations
souples
Permet l’encapsulation de tableaux fortran.
Gestion possible de l’interface avec des programmes
Fortran/C/C++
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
4/1
Le tableau NumPy ndarray
Collection indexable et contigüe d’éléments de même type
Implémentation avec un vrai tableau en mémoire optimisé pour
les performances
Manipulation similaire à tout autre objet Python
Multi-dimensionnel pour tous les types de données
Les dimensions et parcours sont modifiables, les indexations
souples
Permet l’encapsulation de tableaux fortran.
Gestion possible de l’interface avec des programmes
Fortran/C/C++
>> import numpy as np
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
4/1
Le tableau NumPy ndarray
Tableau de taille fixée, multidimensionnel contenant des élements de
méme type et de même taille. Ce tableau peut être défini par :
son contenu sous forme d’une liste de valeurs :
a=np.array([1,3,5,7,9,11,13,17])
http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
5/1
Le tableau NumPy ndarray
Tableau de taille fixée, multidimensionnel contenant des élements de
méme type et de même taille. Ce tableau peut être défini par :
son contenu sous forme d’une liste de valeurs :
a=np.array([1,3,5,7,9,11,13,17])
ses dimensions et son profil :
b=np.array([[1,2,3],[4,5,6]])
http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
5/1
Le tableau NumPy ndarray
Tableau de taille fixée, multidimensionnel contenant des élements de
méme type et de même taille. Ce tableau peut être défini par :
son contenu sous forme d’une liste de valeurs :
a=np.array([1,3,5,7,9,11,13,17])
ses dimensions et son profil :
b=np.array([[1,2,3],[4,5,6]])
son type d’élément :
a=np.array([0.1, 0.0, 0.2],dtype='f')
b=np.array([[1,2,3],[4,5,6]],dtype='i')
http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
5/1
Création d’un tableau numpy
Fonction de ces indices
>>> def initfunction(i,j):
...
return 100+10*i+j
>>> c=np.fromfunction(initfunction,(5,3))
array([[ 100., 101., 102.],
[ 110., 111., 112.],
[ 120., 121., 122.],
[ 130., 131., 132.],
[ 140., 141., 142.]])
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
6/1
Création d’un tableau numpy
Fonction de ces indices
>>> def initfunction(i,j):
...
return 100+10*i+j
>>> c=np.fromfunction(initfunction,(5,3))
array([[ 100., 101., 102.],
[ 110., 111., 112.],
[ 120., 121., 122.],
[ 130., 131., 132.],
[ 140., 141., 142.]])
A partir d’un fichier
>>> a=np.ones((3,5,7))
>>> np.save("data.npy",a)
>>> b=np.load("data.npy")
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
6/1
Les tableaux numpy structurés (Record arrays)
Numpy propose des fonctions pour créer facilement des tableaux.
>>> x = np.zeros((2,),dtype=('i4,f4,a10'))
>>> x[:] = [(1,2.,'Hello'),(2,3.,"World")]
>>> x
array([(1, 2.0, 'Hello'), (2, 3.0, 'World')],
dtype=[('f0', '>i4'), ('f1', '>f4'), ('f2', '|S10')])
Dans cet exemple, nous avons créé un tableau 1D de 2 éléments.
Chaque élément possède trois composantes dont les types sont
entier 32 bits, flottant 32 bits et une chaine de 10 caractères.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
7/1
Les tableaux numpy structurés (Record arrays)
Numpy propose des fonctions pour créer facilement des tableaux.
>>> x = np.zeros((2,),dtype=('i4,f4,a10'))
>>> x[:] = [(1,2.,'Hello'),(2,3.,"World")]
>>> x
array([(1, 2.0, 'Hello'), (2, 3.0, 'World')],
dtype=[('f0', '>i4'), ('f1', '>f4'), ('f2', '|S10')])
Dans cet exemple, nous avons créé un tableau 1D de 2 éléments.
Chaque élément possède trois composantes dont les types sont
entier 32 bits, flottant 32 bits et une chaine de 10 caractères.
>>> x[1]
(2,3.,"World")
empty, empty_like, ones, ones_like, zeros, zeros_like
>>> N=10
>>> A = np.zeros(4*N*N,dtype=np.double).reshape(2*N,2*N)
>>> B = np.zeros((2*N,2*N),dtype=np.double)
http://docs.scipy.org/doc/numpy/reference/routines.array-creation.html
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
7/1
Identifier un type
Diverses fonctions pour construire et manipuler les types
La définition des types permet portabilité et interopérabilité.
>>> a=np.array(range(4))
>>> a
array([0, 1, 2, 3])
>>> a.dtype
dtype('int32')
>>> a.dtype.char
'l'
>>> b=np.array(a,dtype='d')
>>> b
array([ 0., 1., 2., 3.])
>>> b.dtype
dtype('float64')
http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
8/1
Manipulation de profil
flat : vue 1D d’un tableau sans modification
>>> a = np.indices((2,5))
>>> a
array([[[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1]],
[[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]]])
>>> a.flat[:]
array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
9/1
Manipulation de profil
flat : vue 1D d’un tableau sans modification
>>> a = np.indices((2,5))
>>> a
array([[[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1]],
[[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]]])
>>> a.flat[:]
array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
shape : n-uplet des dimensions d’un tableau
>>> a=ones((3,5,7))
>>> a.shape
(3,5,7)
>>> a.shape=(21,5)
>>> np.shape(a)
(21,5)
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
9/1
Manipulation de profil
flat : vue 1D d’un tableau sans modification
>>> a = np.indices((2,5))
>>> a
array([[[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1]],
[[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]]])
>>> a.flat[:]
array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
shape : n-uplet des dimensions d’un tableau
>>> a=ones((3,5,7))
>>> a.shape
(3,5,7)
>>> a.shape=(21,5)
>>> np.shape(a)
(21,5)
La méthode reshape
>>> a=np.arange(105).reshape((3,5,7))
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
9/1
Transposition
>>> a
array([[[ 0,
[ 4,
[[ 8,
[12,
[[16,
[20,
>>> a.T
array([[[ 0,
[ 4,
[[ 1,
[ 5,
[[ 2,
[ 6,
[[ 3,
[ 7,
>>> b=a.T
1,
5,
9,
13,
17,
21,
2,
6,
10,
14,
18,
22,
3],
7]],
11],
15]],
19],
23]]])
8,
12,
9,
13,
10,
14,
11,
15,
16],
20]],
17],
21]],
18],
22]],
19],
23]]])
Retourne une vue du tableau, pensez à la copie ! Existe aussi la
fonction :
>>> a.transpose()
>>> transpose(a)
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
10 / 1
Indexation
>>> a=np.arange(24).reshape(2,3,4)
>>> a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
Pour un élément dans le tableau.
>>> a[0][2][1]
9
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
11 / 1
Indexation
>>> a=np.arange(24).reshape(2,3,4)
>>> a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
Pour un élément dans le tableau.
>>> a[0][2][1]
9
Syntaxe avec implémentation optimisée pour l’accès
>>> a[0,:-1]
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
11 / 1
Indexation
>>> a=np.arange(24).reshape(2,3,4)
>>> a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
Pour un élément dans le tableau.
>>> a[0][2][1]
9
Syntaxe avec implémentation optimisée pour l’accès
>>> a[0,:-1]
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
La syntaxe fonctionne pour la référence et l’assignation
>>> b=a[0:2]
>>> a[0:2]=9
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
11 / 1
Méthodes
Associées au module
>>> np.finfo(numpy.float32).eps
1.1920929e-07
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
12 / 1
Méthodes
Associées au module
>>> np.finfo(numpy.float32).eps
1.1920929e-07
Associées à l’objet ndarray
>>> a=np.arange(6).reshape(3,2)
>>> 1+np.sin(a)
array([[ 1.
, 1.84147098],
[ 1.90929743, 1.14112001],
[ 0.2431975 , 0.04107573]])
>>> a>3
array([[False, False],
[False, False],
[ True, True]], dtype=bool)
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
12 / 1
Méthodes
Associées au module
>>> np.finfo(numpy.float32).eps
1.1920929e-07
Associées à l’objet ndarray
>>> a=np.arange(6).reshape(3,2)
>>> 1+np.sin(a)
array([[ 1.
, 1.84147098],
[ 1.90929743, 1.14112001],
[ 0.2431975 , 0.04107573]])
>>> a>3
array([[False, False],
[False, False],
[ True, True]], dtype=bool)
Appliquées sur la totalité ou une partie du tableau .
>>> a.max(), a.sum()
(5, 15)
>>> a.sum(axis=1) #somme des colonnes
array([1, 5, 9])
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
12 / 1
Copie ou référence
Copie explicite.
b=np.copy(a)
b=np.array(a, copy=True)
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
13 / 1
Copie ou référence
Copie explicite.
b=np.copy(a)
b=np.array(a, copy=True)
Copie implicite.
>>> a=np.array([5,3,6,1,6,7,9,0,8])
>>> np.sort(a)
array([0, 1, 3, 5, 6, 6, 7, 8, 9])
>>> a
array([5, 3, 6, 1, 6, 7, 9, 0, 8])
>>> a.sort()
>>> a
array([0, 1, 3, 5, 6, 6, 7, 8, 9])
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
13 / 1
Copie ou référence
Vue
Copie explicite.
b=np.copy(a)
b=np.array(a, copy=True)
Copie implicite.
>>> a=np.array([5,3,6,1,6,7,9,0,8])
>>> np.sort(a)
array([0, 1, 3, 5, 6, 6, 7, 8, 9])
>>> a
array([5, 3, 6, 1, 6, 7, 9, 0, 8])
>>> a.sort()
>>> a
array([0, 1, 3, 5, 6, 6, 7, 8, 9])
Pierre Navaro (IRMAR)
NumPy
>>> b=a
>>> b.shape=(3,3)
>>> a[0]=-1
>>> c = a.T # c : vue de a
>>> c
array([[-1, 5, 7],
[-1, 6, 8],
[-1, 6, 9]])
>>> b
array([[-1, -1, -1],
[ 5, 6, 6],
[ 7, 8, 9]])
>>> c.base
array([[-1, -1, -1],
[ 5, 6, 6],
[ 7, 8, 9]])
ENSAI le 23 mars 2016
13 / 1
Copie ou référence
Vue
Copie explicite.
b=np.copy(a)
b=np.array(a, copy=True)
Copie implicite.
>>> a=np.array([5,3,6,1,6,7,9,0,8])
>>> np.sort(a)
array([0, 1, 3, 5, 6, 6, 7, 8, 9])
>>> a
array([5, 3, 6, 1, 6, 7, 9, 0, 8])
>>> a.sort()
>>> a
array([0, 1, 3, 5, 6, 6, 7, 8, 9])
>>> b=a
>>> b.shape=(3,3)
>>> a[0]=-1
>>> c = a.T # c : vue de a
>>> c
array([[-1, 5, 7],
[-1, 6, 8],
[-1, 6, 9]])
>>> b
array([[-1, -1, -1],
[ 5, 6, 6],
[ 7, 8, 9]])
>>> c.base
array([[-1, -1, -1],
[ 5, 6, 6],
[ 7, 8, 9]])
Itérateur
>>> b.flat[4]
6
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
13 / 1
Notion de vue et gestion de la mémoire
Une vue fait référence aux éléments d’un autre tableau sans
avoir son propre espace mémoire.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
14 / 1
Notion de vue et gestion de la mémoire
Une vue fait référence aux éléments d’un autre tableau sans
avoir son propre espace mémoire.
L’indexation crée des vues, tout comme reshape et quelques
autres méthodes.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
14 / 1
Notion de vue et gestion de la mémoire
Une vue fait référence aux éléments d’un autre tableau sans
avoir son propre espace mémoire.
L’indexation crée des vues, tout comme reshape et quelques
autres méthodes.
Les éléments d’un tableau peuvent être modifiés en passant par
n’importe quelle vue.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
14 / 1
Notion de vue et gestion de la mémoire
Une vue fait référence aux éléments d’un autre tableau sans
avoir son propre espace mémoire.
L’indexation crée des vues, tout comme reshape et quelques
autres méthodes.
Les éléments d’un tableau peuvent être modifiés en passant par
n’importe quelle vue.
Il n’est pas possible de vérifier s’il existe des vues pour un
tableau donné.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
14 / 1
Notion de vue et gestion de la mémoire
Une vue fait référence aux éléments d’un autre tableau sans
avoir son propre espace mémoire.
L’indexation crée des vues, tout comme reshape et quelques
autres méthodes.
Les éléments d’un tableau peuvent être modifiés en passant par
n’importe quelle vue.
Il n’est pas possible de vérifier s’il existe des vues pour un
tableau donné.
Tant qu’au moins une vue existe, un tableau ne peut pas être
détruit.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
14 / 1
Notion de vue et gestion de la mémoire
Une vue fait référence aux éléments d’un autre tableau sans
avoir son propre espace mémoire.
L’indexation crée des vues, tout comme reshape et quelques
autres méthodes.
Les éléments d’un tableau peuvent être modifiés en passant par
n’importe quelle vue.
Il n’est pas possible de vérifier s’il existe des vues pour un
tableau donné.
Tant qu’au moins une vue existe, un tableau ne peut pas être
détruit.
gros = N.arange(100000000)
petit = gros[:5]
del gros
gros = N.arange(100000000)
petit = gros[:5].copy()
del gros
le gros tableau reste en mémoire jusqu’à la disparition du petit.
Mieux vaut faire une copie.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
14 / 1
Ufuncs : Universal functions
Opèrent sur un tableau élément par élément. Exemple :
add(a,b) avec a et b ndarrays est plus performant qu’une
boucle
http://docs.scipy.org/doc/numpy/reference/ufuncs.html
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
15 / 1
Ufuncs : Universal functions
Opèrent sur un tableau élément par élément. Exemple :
add(a,b) avec a et b ndarrays est plus performant qu’une
boucle
Vectorisable : Une fonction prend des vecteurs en entrée et
produit un vecteur en sortie. L’utilisateur peut utiliser l’API pour
créer ses propres ufuncs
http://docs.scipy.org/doc/numpy/reference/ufuncs.html
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
15 / 1
Ufuncs : Universal functions
Opèrent sur un tableau élément par élément. Exemple :
add(a,b) avec a et b ndarrays est plus performant qu’une
boucle
Vectorisable : Une fonction prend des vecteurs en entrée et
produit un vecteur en sortie. L’utilisateur peut utiliser l’API pour
créer ses propres ufuncs
Syntaxe compacte sans boucle ⇒ les ufuncs sont parfois
difficiles à lire.
>>> x=np.arange(10)
>>> x[(x**3-9*x**2+23*x-15)==0]
array([1, 3, 5])
>>> np.sqrt(x)
array([ 0.
, 1.
,
2.23606798, 2.44948974,
1.41421356,
2.64575131,
1.73205081,
2.82842712,
2.
3.
,
])
http://docs.scipy.org/doc/numpy/reference/ufuncs.html
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
15 / 1
Matrices
Dérivée de ndarray. Toute matrix est au moins un ndarray
Utilisée dans numpy.linalg
Toujours 2D, attention un slice de Matrix est en 2D
Certaines méthodes de Matrix masquent les méthodes
équivalentes de ndarray
>>> a=np.arange(9).reshape(3,3)
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> b=np.matrix(a)
matrix([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> b[0]
matrix([[0, 1, 2]])
>>> a[0]
array([0, 1, 2])
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
16 / 1
Random : numpy.random
Fonctions adaptées au ndarrays pour tous les types d’éléments
>>> a=np.random.randint(100,size=(3,2,4))
>>> a
array([[[93, 19, 44, 54],
[81, 63, 13, 83]],
[[22,
[19,
7, 49, 82],
8, 57, 7]],
[[25, 40, 54, 13],
[81, 16, 26, 72]]])
>>> np.random.shuffle(a.flat)
>>> a
array([[[26, 13, 19, 8],
[19, 44, 72, 54]],
[[25, 93, 16, 57],
[81, 83, 13, 7]],
[[ 7, 63, 81, 54],
[49, 40, 22, 82]]])
http://docs.scipy.org/doc/numpy/reference/routines.random.html
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
17 / 1
Quelques exemples de fonctions...
trapz(y[, x, dx, axis]) : Intégration par la méthode des trapèzes.
gradient(f, *varargs) : Gradient d’un tableau à N dimensions.
diff(a[, n, axis]) : Différences finies.
dot(a, b) : Produit de matrices.
inner(a, b) : Produit scalaire.
cholesky(a) : Factorisation de Cholesky.
eig(a) : Valeurs et vecteurs propres.
eigvals(a) : Valeurs propres.
det(a) : Déterminant.
solve(a, b) : Solution d’un système linéaire.
inv(a) : Inversion de matrices.
where(condition, op1, op2) op1 quand la condition est vraie.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
18 / 1
Utilisation de la mémoire
Un des inconvénients de NumPy est l’allocation d’un grand nombre
de tableaux temporaires. Une expression simple comme
c = 2 ∗ a + 3 ∗ b est en fait traitée comme
1
tmp1 = 2*a
2
tmp2 = 3*b
3
c = tmp1 + tmp2
La création de trois tableaux, dont deux sont presque
immédiatement supprimés, est coûteuse en temps, surtout pour des
petits tableaux, et coûteuse en espace mémoire, surtout pour les
grand tableaux. Une autre inconvénient est la mauvaise utilisation
du cache du processeur pour ce genre d’opération.
©Konrad Hinsen
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
19 / 1
Arithmétique en place
>>> a = np.arange(10)
>>> a
array([0 , 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a *= 2
>>> a
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
>>> np.multiply(a, 2, a)
array([ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36])
>>> a
array([ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36])
>>> b = np.zeros(a.shape, a.dtype)
>>> np.multiply(a, 2, b)
array([ 0, 8, 16, 24, 32, 40, 48, 56, 64, 72])
>>> a
array([ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36])
>>> b
array([ 0, 8, 16, 24, 32, 40, 48, 56, 64, 72])
©Konrad Hinsen
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
20 / 1
numexpr
La bibliothèque numexpr évalue des expressions contenant des
tableaux de façon optimisée en les compilant en langage C :
élimination des tableaux intermédiaires accès aux tableaux optimisé
pour utilise le cache du processeur utilisation de processeurs
multiples
import numpy as np
import numexpr
>>> a = 3.*np.arange(10000)-2.
>>> b = 0.1*np.arange(10000)**2
>>> numexpr.evaluate ("3*a**2-5.*b")
array ( [ 1.20000000e+01, 2.50000000e+00,
4.60000000e+01, . . . ,
2.64805036e+09, 2.64858019e+09, 2.64911007e+09])
©Konrad Hinsen
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
21 / 1
Conseils de programmation
Eviter les boucles.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
22 / 1
Conseils de programmation
Eviter les boucles.
Il est plus efficace de faire 3 operations vectorielles plutôt
qu’une boucle.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
22 / 1
Conseils de programmation
Eviter les boucles.
Il est plus efficace de faire 3 operations vectorielles plutôt
qu’une boucle.
Changement d’habitude important qui requiert de l’experience.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
22 / 1
Entrées/Sorties
Formats Numpy Binaire et texte (.npy .npz) :
load/save/savez/loadtxt/savetxt
Pickle
h5py
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
23 / 1
Pour finir
fft : Fast Fourrier Transform.
random : random numbers generation.
linalg : Algèbre linéaire (Lapack, ATLAS ou MKL + BLAS).
distutils : Outils de compilation pour les package numpy.
f2py : interfacage Fortran pour Python/numpy.
Quelques logiciels utilisant numpy :
Scipy http://www.scipy.org.
pyopencl, pycuda http://mathema.tician.de/software.
pyamg http://code.google.com/p/pyamg/.
femhub http://base.femhub.org/.
Pierre Navaro (IRMAR)
NumPy
ENSAI le 23 mars 2016
24 / 1
Téléchargement