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