{"id":228,"date":"2016-09-20T10:45:39","date_gmt":"2016-09-20T10:45:39","guid":{"rendered":"https:\/\/www.ephiquant.com\/?p=228"},"modified":"2016-11-23T15:21:56","modified_gmt":"2016-11-23T15:21:56","slug":"numpy-numerical-python-les-bases-de-la-constriction","status":"publish","type":"post","link":"https:\/\/www.ephiquant.com\/?p=228","title":{"rendered":"Numpy (Numerical Python): Les bases de la constriction"},"content":{"rendered":"<p>Si vous avez d\u00e9j\u00e0 des notions en <strong>Python<\/strong>, vous connaissez certainement les objets tels que les listes, les tuples, les dictionnaires &#8230;Toutefois, ces objets sont d&#8217;usage g\u00e9n\u00e9ral et manquent de maturit\u00e9 scientifiques et par dessus tout font trop recours aux boucles qui, comme nous le savons, sont synonymes de lourdeur d&#8217;ex\u00e9cution.\u00a0C&#8217;est pour cette raison que pour les calculs num\u00e9riques, l&#8217;analyses des donn\u00e9es, &#8230;<strong>Python<\/strong> dispose de la librairie\u00a0<span style=\"color: #0000ff;\">numpy<\/span> qui permet la cr\u00e9ation et la manipulation des matrices.<\/p>\n<p>Les matrices sont les\u00a0objets\u00a0math\u00e9matiques centraux de l&#8217;<a href=\"http:\/\/www.sciences.ch\/htmlfr\/algebre\/algebrelineaire01.php\">alg\u00e8bre lin\u00e9aire<\/a> mais aussi, la structures de donn\u00e9es la plus efficace\u00a0pour effectuer des calculs scientifiques sur ordinateur. Par ce que, pour tout data Scientiste ou Analyste quant qui se respecte, <span style=\"color: #0000ff;\">numpy<\/span> (et plus encore <span style=\"color: #0000ff;\">Scipy<\/span>, <span style=\"color: #0000ff;\">matplotlib<\/span>) et plus sp\u00e9cifiquement son\u00a0objet <span style=\"color: #0000ff;\">ndarray<\/span> est tr\u00e8s indispensable, nous consacrerons ce tutoriel, \u00e0 la manipulation de cet objet.<\/p>\n<h3><strong>Importation de la librairie <span style=\"color: #0000ff;\">numpy<\/span> et efficience d&#8217;un objet\u00a0<span style=\"color: #0000ff;\">ndarray<\/span><\/strong><\/h3>\n<p>Il existe diff\u00e9rente mani\u00e8re d&#8217;importer une librairie, nous pour cet article nous chargerons <span style=\"color: #0000ff;\">numpy<\/span> de la fa\u00e7on suivante : <span class=\"lang:python decode:true crayon-inline \">import numpy as np<\/span>\u00a0. En suite, nous allons faire une petite\u00a0comparaison entre une liste cr\u00e9er avec la fonction <span style=\"color: #0000ff;\">arange()<\/span> de <span style=\"color: #0000ff;\">numpy<\/span> et une liste\u00a0<span style=\"color: #0000ff;\">range()<\/span>\u00a0standards de python. Pourquoi sp\u00e9cialement ces deux fonctions ? Par ce qu&#8217;elles sont sens\u00e9es g\u00e9n\u00e9rer des s\u00e9quences\/s\u00e9ries de chiffres. Nous allons comparer leur performance avec la librairie <span style=\"color: #0000ff;\">timeit.<\/span><\/p>\n<pre class=\"lang:python decode:true\">&gt;&gt;&gt; import numpy as np\r\n&gt;&gt;&gt; import timeit \r\n&gt;&gt;&gt; N = 1000\r\n&gt;&gt;&gt; np_list = np.arange(N) # liste ndarray\r\n&gt;&gt;&gt; std_list = range(N)  # liste standard\r\n&gt;&gt;&gt; t_np  = timeit.Timer(\"np_list.sum()\",\"from __main__ import np_list\")\r\n&gt;&gt;&gt; t_std = timeit.Timer(\"sum(std_list)\",\"from __main__ import std_list\")\r\n&gt;&gt;&gt; print(\"Temps avec ndarray : \", t_np.timeit())\r\nTemps avec ndarray :  3.144534872488408\r\n&gt;&gt;&gt; print(\"Temps avec liste : \", t_std.timeit())\r\nTemps avec liste :  23.97810386881762<\/pre>\n<p>Comme nous\u00a0pouvons l&#8217;observer, \u00a0sommer une liste standard de 1000 \u00e9l\u00e9ments ( obtenu avec <span style=\"color: #0000ff;\">range()<\/span>), n\u00e9cessite 8 fois plus de temps qu&#8217;avec un objet <span style=\"color: #0000ff;\">ndarray <\/span>(obtenu avec <span style=\"color: #0000ff;\">arange()<\/span>). Ces performances sont \u00e0 relativiser en fonction du syst\u00e8me utilis\u00e9.<\/p>\n <style type=\"text\/css\" scoped=\"scoped\">.alert-6a0e642b6f845{background-color:#f5f5f5;color:#217244;border-color:#217244;border-width:0px;border-radius:0px;} <\/style><div class=\"alert magee-alert  alert-6a0e642b6f845 box-shadow \" role=\"alert\" id= \"\"><i class=\"fa fa-info-circle\"><\/i>En effet, dans les manuscrits de la l\u00e9gende du Manda (L\u2019anc\u00eatre t ma\u00eetres des pythons), l&#8217;histoire voudrait que celui qui aurait ma\u00eetris\u00e9 le trio de librairies(pour ne pas dire \u00e9cailles) numpy, Scipy et matplotlib, dispose de puissance n\u00e9cessaire pour faire face \u00e0 Iron <strong>MATLAB<\/strong>. Alors, les pr\u00e9tendant au titre de Manda sont inform\u00e9s.<\/div>\n<h3><strong>Cr\u00e9ation et caract\u00e9ristiques d&#8217;objets\u00a0<span style=\"color: #0000ff;\">ndarray<\/span><\/strong><\/h3>\n<p>Un objet de type\u00a0<strong> <span style=\"color: #0000ff;\">ndarray <\/span><\/strong>est un tableau multidimensionnel (d&#8217;o\u00f9 le nd = n-dimension) prenant en charge des donn\u00e9es de type homog\u00e8ne, c&#8217;est \u00e0 dire que les donn\u00e9es doivent \u00eatre de m\u00eame type integer, float, &#8230;etc. Structurellement, c&#8217;est un objet constitu\u00e9 des donn\u00e9es et de m\u00e9tadonn\u00e9es (informations sur les donn\u00e9es). Ces derri\u00e8res portent sur les dimensions, la taille et le type de donn\u00e9es notamment.\u00a0Pour cr\u00e9er un objet de type <span style=\"color: #0000ff;\">ndarray<\/span>, on utilise la fonction <span style=\"color: #0000ff;\">array()<\/span>, qui gr\u00e2ce\u00a0\u00e0 l&#8217;argument<span style=\"color: #993366;\"> <em>dtype<\/em><\/span> permet de sp\u00e9cifier\u00a0le type des donn\u00e9es :<\/p>\n<pre class=\"lang:python decode:true\">&gt;&gt;&gt; matrix = np.array([[3.2,5,.2,-5],[5.2,9.2,-3,4],[0,-1.2,7.2,8]])\r\n&gt;&gt;&gt; matrix  # afficher la matrice\r\narray([[ 3.2,  5. ,  0.2, -5. ],\r\n       [ 5.2,  9.2, -3. ,  4. ],\r\n       [ 0. , -1.2,  7.2,  8. ]])\r\n&gt;&gt;&gt; type(matrix) # type d'objet\r\n&lt;class 'numpy.ndarray'&gt;\r\n&gt;&gt;&gt; matrix.dtype # type des donn\u00e9es contenues\r\ndtype('float64')\r\n&gt;&gt;&gt; matrix.ndim   # la dimension de l'objet\r\n2\r\n&gt;&gt;&gt; matrix.shape # les dimensions de l'objet Nombre Lignes,colonnes\r\n(3, 4)\r\n&gt;&gt;&gt; matrix.size  # la taille de la matrice Nombre de Lignes * Nombre de Lignes Colonnes\r\n12\r\n&gt;&gt;&gt; matrix.nbytes # la taille m\u00e9moire de la matrice\r\n96<\/pre>\n<p>Nous venons de cr\u00e9er une matrice donc un tableau \u00e0 deux dimensions de type implicite <span style=\"color: #0000ff;\">float<\/span>,donc les caract\u00e9ristiques essentielles restent les dimensions des lignes et colonnes qui nous sont renvoy\u00e9es sous forme de tuple (lignes, colonnes).<\/p>\n<h3><strong>Quelques matrices remarquables<\/strong><\/h3>\n<p>Nous avons vu qu&#8217;on pouvais cr\u00e9er des matrices ou de fa\u00e7on plus g\u00e9n\u00e9ral, des tableaux multidimensionnels avec la fonction <span style=\"color: #0000ff;\">array()<\/span>. Mais en alg\u00e8bre lin\u00e9aire, nous aurons besoins de quelques matrices tr\u00e8s pratiques pour op\u00e9rer des calculs comme des matrices unitaires, diagonales, des s\u00e9quences ou encore des matrices al\u00e9atoires qui s&#8217;av\u00e8rent tr\u00e8s utiles en simulation num\u00e9rique :<\/p>\n<pre class=\"lang:python decode:true\"># les s\u00e9quences \r\nnp.arange(1.,20,2) # g\u00e9n\u00e9rer des nombres entre 1 et 20 avec un pas de 2\r\nnp.linspace(1,5,10) # g\u00e9n\u00e9rer 10 nombres compris entre 1 et 5\r\nnp.random.rand(10) # g\u00e9n\u00e9rer 5 nombres al\u00e9atoires compris entre 0 et 1\r\n# Cr\u00e9e les matrices avec la fonction matrix()\r\nnp.matrix(\"1 0;-1 3\") # 2X2\r\nnp.matrix(\"1.1 0.2 5.5 0;-1.5 3.0 8.9 0.0;-1.5 6.2 5 -4\")# 3X4\r\n# Matrices diagonales\r\nnp.diag(1,3) # matrice unitaire\r\nnp.eye(3)\r\nnp.identity(3)\r\nnp.diag([-2.3,5.2,3,4]) # diagonal quelconque\r\nnp.diag(np.arange(10,40,10))\r\n# matrice ne contenant que des 0\r\nnp.zeros(5) # dimensions 1*5\r\nnp.zeros((5,4)) # dimensions 5*4\r\nnp.zeros_like(matrix) # clonage de dimensions et de type de donn\u00e9es\r\n# matrice ne contenant que des 1\r\nnp.ones(5) ; np.ones((2,3))\r\nnp.ones_like(matrix) # clonage de dimensions et de type de donn\u00e9es\r\n<\/pre>\n<p>Nous avons jusqu&#8217;ici cr\u00e9\u00e9 des tableaux de dimension inf\u00e9rieure ou \u00e9gale \u00e0 2 car tr\u00e8s communs. Noter qu&#8217;avec la fonction <span style=\"color: #0000ff;\">array()<\/span>, nous pouvons cr\u00e9er des tableaux de N dimension d&#8217;o\u00f9 le nom de l&#8217;objet <span style=\"color: #0000ff;\">ndarray<\/span>. Par exemple, l&#8217;objet x ci-dessous est un tableau de 4 dimensions :<\/p>\n<pre class=\"lang:python decode:true\">x = np.array([[[[2.3,-1.,2.],[0.2,0,0],[-1.,5.2,7.0]],[[2.,1.2,1],[3.1,3,5],[1.2,-5,6]]],\r\n              [[[2.1,1.1,9.],[1.2,3.3,7.8],[8.8,4.2,-3.]],[[1.2,-9,0],[6.2,2.3,1.2],[8.5,2.3,5.2]]],\r\n              [[[0.2,1.2,1],[-0.2,2.3,2],[6.6,10.,.3]],[[4.2,5.2,3.8],[8.2,2.5,1.1],[5.2,-1.2,3.1]]],\r\n              ])\r\nx.ndim # verifier<\/pre>\n<h3><strong>Manipulation des <span style=\"color: #0000ff;\">ndarray<\/span><\/strong><\/h3>\n<ul>\n<li>\n<h4>Indexation et extraction d&#8217;\u00e9l\u00e9ments ou de sous-ensembles<\/h4>\n<\/li>\n<\/ul>\n<p>L&#8217;indexation d&#8217;\u00e9l\u00e9ment d&#8217;une matrice ou d&#8217;un <span style=\"color: #0000ff;\">ndarray<\/span> en g\u00e9n\u00e9ral, se fait entre les crochets <span style=\"color: #0000ff;\">[]. <\/span>Et selon que l&#8217;on veut s\u00e9lectionner des \u00e9l\u00e9ments du d\u00e9but \u00e0 la fin ou de la fin au d\u00e9but, on utilise un chiffre positif ou n\u00e9gatif, dans le cas o\u00f9 l&#8217;indexation est faite avec les chiffres(on peut faire une indexation bool\u00e9enne). Aussi, l&#8217;indexation inter-dimension est s\u00e9par\u00e9e par une virgule en plus clair, \u00a0si x est une matrice alors pour indexer l\u2019\u00e9l\u00e9ment situ\u00e9 \u00e0 l&#8217;intersection de la 2\u00e8me ligne et de la 3\u00e8me colonne, on \u00e9crira : x[2,3]. Ici nous ne travaillerons que l&#8217;indexation d&#8217;objet de 1D et 2D. Si besoin la logique peut \u00eatre g\u00e9n\u00e9ralis\u00e9e aux dimensions sup\u00e9rieurs.<\/p>\n<pre class=\"lang:python decode:true \"># objet 1D vecteur matrice 12X1\r\nvector = np.array([1.6,-3,0,5,9,-2,3.4,-5,8.7,2,3,5],dtype = float)\r\nvector[0] # indexation du 1er \u00e9l\u00e9ment\r\nvector[2:5] # indexation du 3\u00e8me au 5\u00e8me \u00e9l\u00e9ment\r\nvector[1:12:2] # indexation du 2\u00e8me au 12\u00e8me \u00e9l\u00e9ment en raison d'un pas de 2\r\nvector[:5] # indexation des 5 premiers elements\r\nvector[5:] # indexation des \u00e9l\u00e9ments situ\u00e9s au del\u00e0 du 5\u00e8me \u00e9l\u00e9ment\r\nvector[::-1] # inverser l'ordre des \u00e9l\u00e9ments \r\nvector[[5,2,3]] # indexation d\u2019\u00e9l\u00e9ments non contigus\r\nvector[-1] # indexation n\u00e9gative faisant r\u00e9f\u00e9rence au premier \u00e9l\u00e9ment partant de la fin \r\nvector[vector &lt; 0.0] # indexation bool\u00e9enne des des valeurs n\u00e9gatives\r\n# objet 2D matrice 5X4\r\nmatrix = np.array([[5.2,6.2,-3.0,0.0],\r\n                   [9.2,3.5,-5.6,0.5],\r\n                   [2.2,0.5,3.4,-9.2],\r\n                   [-1.2,3.5,-5.6,2.5],\r\n                   [8.1,-1.2,2.6,3.2]],dtype = float)\r\nmatrix[:,:] # indexation de toutes les lignes et colonnes\r\nmatrix[:,2] # indexation de la 3\u00e8me colonne\r\nmatrix[2,:] # indexation de la 3\u00e8me ligne\r\nmatrix[:,1:4] # indexation de la 2\u00e8me colonne \u00e0 la 5\u00e8me \r\nmatrix[:3,:3] # les 3\u00e8mes lignes des 3 premi\u00e8res colonnes\r\nmatrix[3,3] # indexation d'un \u00e9l\u00e9ment en l\u2019occurrence 2.5\r\nmatrix[matrix &lt; 0.0] # indexation bool\u00e9enne des valeurs n\u00e9gatives\r\n<\/pre>\n <style type=\"text\/css\" scoped=\"scoped\">.alert-6a0e642b6f878{background-color:#f5f5f5;color:#217244;border-color:#217244;border-width:0px;border-radius:0px;} <\/style><div class=\"alert magee-alert  alert-6a0e642b6f878 box-shadow \" role=\"alert\" id= \"\"><i class=\"fa fa-info-circle\"><\/i>Il\u00a0faut noter que l&#8217;indexation du premier \u00e9l\u00e9ment d&#8217;un tableau en Python \u00e0 l&#8217;instar des tableaux en \u00a0C\/C++, se fait avec\u00a00 et non 1 comme en sup-<strong>R<\/strong>-man ou en Iron-<strong>MATLAB<\/strong> par exemple&#8230;<\/div>\n<ul>\n<li>\n<h4>Op\u00e9ration de transformation<\/h4>\n<\/li>\n<\/ul>\n<p><strong>La fonction <span style=\"color: #0000ff;\">copy()<\/span><\/strong> : on pourrait s&#8217;interroger sur le bien fond\u00e9 d&#8217;une telle fonction sachant qu&#8217;il suffirait peut \u00eatre d&#8217;affecter un objet \u00e0 un nouvel\u00a0objet qui en contiendrait une r\u00e9plique exacte.\u00a0Il faut savoir en effet que la simple affectation d&#8217;un objet\u00a0existant \u00e0 un\u00a0nouvel objet,\u00a0cr\u00e9e seulement une nouvelle r\u00e9f\u00e9rence vers le m\u00eame objet, et non un nouvel objet. \u00a0Par exemple, observons de plus pr\u00e8s le r\u00e9sultat des instructions\u00a0ci-dessous :<\/p>\n<pre class=\"lang:python decode:true\">&gt;&gt;&gt; X = np.arange(1,10)\r\n&gt;&gt;&gt; X\r\narray([1, 2, 3, 4, 5, 6, 7, 8, 9])\r\n&gt;&gt;&gt; Y = X  # affectation pour faire une \"copie\" de X\r\n&gt;&gt;&gt; Y\r\narray([1, 2, 3, 4, 5, 6, 7, 8, 9])\r\n&gt;&gt;&gt; Y[1:5] = np.zeros(4) # modifions Y\r\n&gt;&gt;&gt; Y # Y modifi\u00e9\r\narray([1, 0, 0, 0, 0, 6, 7, 8, 9])\r\n&gt;&gt;&gt; X # X aussi s'en trouve affect\u00e9\r\narray([1, 0, 0, 0, 0, 6, 7, 8, 9])\r\n&gt;&gt;&gt; id(X) \r\n1886180221056\r\n&gt;&gt;&gt; id(Y)\r\n1886180221056<\/pre>\n<p>On voit bien que les deux variables pointent vers un m\u00eame objet( ils ont la m\u00eame adresse m\u00e9moire) et le r\u00e9sultat obtenu ou la d\u00e9pendance entre ces deux variables n&#8217;est pas vraiment ce que nous recherchons. Ainsi, pour faire une vraie copie, ind\u00e9pendante, on utilise <span style=\"color: #0000ff;\">copy()<\/span>.<\/p>\n<pre class=\"lang:python decode:true\">&gt;&gt;&gt; X = np.arange(1,10)\r\n&gt;&gt;&gt; Y = X.copy()\r\n&gt;&gt;&gt; Y[:] = 0 # modifions Y\r\n&gt;&gt;&gt; Y\r\narray([0, 0, 0, 0, 0, 0, 0, 0, 0])\r\n&gt;&gt;&gt; X # X n'est plus affect\u00e9\r\narray([1, 2, 3, 4, 5, 6, 7, 8, 9])<\/pre>\n<p><strong>La fonction <span style=\"color: #0000ff;\">reshape()<\/span><\/strong> : cette fonction permet notamment de modifier l&#8217;attribut <span style=\"color: #0000ff;\">shape<\/span>, que nous avons vu plus haut et donc de changer la dimension d&#8217;un objet.<\/p>\n<pre class=\"lang:python decode:true \">&gt;&gt;&gt; X = np.arange(20)\r\n&gt;&gt;&gt; X.reshape(4,5) # transformer l'objet d'1D en 2D\r\narray([[ 0,  1,  2,  3,  4],\r\n       [ 5,  6,  7,  8,  9],\r\n       [10, 11, 12, 13, 14],\r\n       [15, 16, 17, 18, 19]])\r\n&gt;&gt;&gt; X.reshape(2,2,5) # transformer l'objet d'1D en 3D\r\narray([[[ 0,  1,  2,  3,  4],\r\n        [ 5,  6,  7,  8,  9]],\r\n\r\n       [[10, 11, 12, 13, 14],\r\n        [15, 16, 17, 18, 19]]])<\/pre>\n<p>Nous pourrions aboutir aux m\u00eames transformations en agissant sur l&#8217;attribut shape, comme-ceci : <span class=\"lang:r decode:true crayon-inline \">X.shape = (4,5)<\/span><\/p>\n<p><strong>Les fonctions\u00a0<\/strong><span style=\"color: #0000ff;\"><strong>ravel()<\/strong><\/span>\u00a0et <span style=\"color: #0000ff;\"><strong>flatten()<\/strong>\u00a0<\/span>: Ces fonctions transforment tous les objets de dimensions sup\u00e9rieurs \u00e0 1 en des objets de 1D. Mais alors pourquoi 2 fonctions ? Par ce que l&#8217;une c&#8217;est-\u00e0-dire <span style=\"color: #0000ff;\">ravel()<\/span> renvoie seulement une r\u00e9f\u00e9rence \u00e0 l&#8217;objet de d\u00e9part alors que l&#8217;autre c&#8217;est-\u00e0-dire <span style=\"color: #0000ff;\">flatten()<\/span>\u00a0cr\u00e9e un objet ind\u00e9pendant (comme avec la fonction <span style=\"color: #0000ff;\">copy()<\/span> ce que l&#8217;on a vu ci-dessus) :<\/p>\n<pre class=\"lang:python decode:true \">&gt;&gt;&gt; matrix = np.array([[5.2,6.2,-3.0,0.0],\r\n...                    [9.2,3.5,-5.6,0.5],\r\n...                    [2.2,0.5,3.4,-9.2],\r\n...                    [-1.2,3.5,-5.6,2.5],\r\n...                    [8.1,-1.2,2.6,3.2]],dtype = float)\r\n&gt;&gt;&gt; matrix.shape\r\n(5, 4)\r\n&gt;&gt;&gt; matrix.ravel()\r\narray([ 5.2,  6.2, -3. ,  0. ,  9.2,  3.5, -5.6,  0.5,  2.2,  0.5,  3.4,\r\n       -9.2, -1.2,  3.5, -5.6,  2.5,  8.1, -1.2,  2.6,  3.2])\r\n&gt;&gt;&gt; matrix.flatten()\r\narray([ 5.2,  6.2, -3. ,  0. ,  9.2,  3.5, -5.6,  0.5,  2.2,  0.5,  3.4,\r\n       -9.2, -1.2,  3.5, -5.6,  2.5,  8.1, -1.2,  2.6,  3.2])<\/pre>\n<p><strong>La fonction <span style=\"color: #0000ff;\">transpose()<\/span><\/strong> : La transposition est une op\u00e9ration courante en alg\u00e8bre linaire, tr\u00e8s pratique sur les matrices notamment. structurellement\u00a0parlant, il s&#8217;agit de faire une rotation de la matrice par rapport \u00e0 sa diagonale.<\/p>\n<pre class=\"lang:python decode:true\">&gt;&gt;&gt; matrix\r\narray([[ 5.2,  6.2, -3. ,  0. ],\r\n       [ 9.2,  3.5, -5.6,  0.5],\r\n       [ 2.2,  0.5,  3.4, -9.2],\r\n       [-1.2,  3.5, -5.6,  2.5],\r\n       [ 8.1, -1.2,  2.6,  3.2]])\r\n&gt;&gt;&gt; matrix.shape\r\n(5, 4)\r\n&gt;&gt;&gt; matrix.transpose()\r\narray([[ 5.2,  9.2,  2.2, -1.2,  8.1],\r\n       [ 6.2,  3.5,  0.5,  3.5, -1.2],\r\n       [-3. , -5.6,  3.4, -5.6,  2.6],\r\n       [ 0. ,  0.5, -9.2,  2.5,  3.2]])\r\n&gt;&gt;&gt; matrix.transpose().shape \r\n(4, 5)<\/pre>\n<h3><strong>Op\u00e9rations math\u00e9matiques et statistiques :<\/strong><\/h3>\n<ul>\n<li>\n<h4>Les op\u00e9rations et fonctions math\u00e9matiques g\u00e9n\u00e9rales<\/h4>\n<\/li>\n<\/ul>\n<p>Avec<span style=\"color: #0000ff;\">\u00a0<\/span>les objets <span style=\"color: #0000ff;\">ndarray<\/span>, les op\u00e9rations basiques telles que l&#8217;addition, la soustractions, la multiplication et la division sont possibles et mieux\u00a0encore\u00a0<span style=\"color: #0000ff;\">numpy<\/span>\u00a0propose des fonctions pour ces op\u00e9rations. Par ailleurs,\u00a0<span style=\"color: #0000ff;\">numpy<\/span> offre \u00e9galement la possibilit\u00e9 d&#8217;utiliser des fonctions math\u00e9matiques habituelles telles que , <span style=\"color: #0000ff;\">sin()<\/span>, <span style=\"color: #0000ff;\">cos()<\/span>, <span style=\"color: #0000ff;\">exp()<\/span>, <span style=\"color: #0000ff;\">log()<\/span>&#8230;Ces fonctions ont \u00e9t\u00e9 baptis\u00e9es &#8220;universal functions&#8221; (<span class=\"lang:r highlight:0 decode:true crayon-inline\">ufunc<\/span>). Voici quelques\u00a0utilisations de ces fonctions :<\/p>\n<pre class=\"lang:python decode:true \">A = np.array([[12.5,13.0],[14.0,-10.5]], dtype = float)\r\nB = np.array([[-12.5,15.0],[15.5,11.2]],dtype = float)\r\nA+B ; np.add(A,B)\r\nA-B ; np.subtract(A,B)\r\nA*B ; np.multiply(A,B)\r\nA\/B ; np.divide(A,B)\r\nnp.log(A)   # logarithme de base e\r\nnp.log10(A) # logarithme de base 10\r\nnp.sqrt(A)  # racine carr\u00e9e \r\nnp.abs(A)   # valeur absolue\r\nnp.exp(A)   # exponentiel e^A<\/pre>\n<ul>\n<li>\n<h4>Quelques\u00a0fonctions statistiques<\/h4>\n<\/li>\n<\/ul>\n<p>Nous pouvons\u00a0op\u00e9rer de simples calculs statistiques tels que la somme, la moyenne, la m\u00e9diane, la variance, l&#8217;\u00e9cart-type&#8230;. Il faut savoir que pour toutes ces fonctions \u00e9num\u00e9r\u00e9es ci-dessous, <span style=\"color: #0000ff;\">sum()<\/span>, <span style=\"color: #0000ff;\">mean()<\/span>, <span style=\"color: #0000ff;\">max(),<\/span>&#8230;, on a la l&#8217;argument <span style=\"color: #993366;\">axis<\/span>, qui lorsqu&#8217;il est \u00e9gal \u00e0 0, effectue l&#8217;op\u00e9ration pour chaque ligne et pour chaque colonne, si <span class=\"lang:r decode:true crayon-inline \">axis = 1<\/span>\u00a0.<\/p>\n<pre class=\"lang:python decode:true \">X = np.array([[1,3,3],[1,4,3],[1,3,4]],dtype = float)\r\nX.sum()      # la somme\r\nX.sum(axis = 0) # somme par ligne\r\nX.sum(axis = 1) # somme par colonne\r\nX.mean()     # la moyenne\r\nnp.median(X) # la mediane\r\nnp.percentile(X,(25,50,75)) # les 3 quartiles\r\nX.max()      # le maximum\r\nX.argmax()   # l'indice du maximum\r\nX.min()      # le minimum\r\nX.argmin()   # l'indice du minimum\r\nX.cumsum()   # les sommes cumul\u00e9es\r\nX.var()      # la variance\r\nX.std()      # l'\u00e9cart-type<\/pre>\n<p>Si l&#8217;on s&#8217;y conna\u00eet un peu en <strong>R<\/strong>, on aurait remarqu\u00e9 la fameuse fonction <span style=\"color: #993366;\">summary()<\/span>, qui permet de faire d&#8217;afficher pour chaque colonne d&#8217;un objet, le minimum et le maximum, les trois quartiles et la moyenne. Pour ceux qui ont un faible pour cette fameuse fonction en voici une r\u00e9plique :<\/p>\n<pre class=\"lang:python decode:true\">&gt;&gt;&gt; def summary(matrix):\r\n      for i in range(matrix.shape[1]):\r\n        print(\"Min. :\",matrix[:,i].min(),\r\n           \"\\n1st Qu. :\",np.percentile(matrix[:,i],25),\r\n           \"\\nMedian :\" ,np.median(matrix[:,i]) ,\r\n           \"\\nMean :\" , matrix[:,i].mean(),\r\n           \"\\n3rd Qu. :\", np.percentile(matrix[:,i],75)  , \r\n           \"\\nMax. :\", matrix[:,i].max(),\"\\n\")\r\n&gt;&gt;&gt; summary(X)\r\nMin. : 1.0 \r\n1st Qu. : 1.0 \r\nMedian : 1.0 \r\nMean : 1.0 \r\n3rd Qu. : 1.0 \r\nMax. : 1.0 \r\n\r\nMin. : 3.0 \r\n1st Qu. : 3.0 \r\nMedian : 3.0 \r\nMean : 3.33333333333 \r\n3rd Qu. : 3.5 \r\nMax. : 4.0 \r\n\r\nMin. : 3.0 \r\n1st Qu. : 3.0 \r\nMedian : 3.0 \r\nMean : 3.33333333333 \r\n3rd Qu. : 3.5 \r\nMax. : 4.0 \r\n<\/pre>\n<p>Toutefois, l&#8217;on peut faire appel \u00e0 la fonction <span style=\"color: #0000ff;\">describe()<\/span>, de la c\u00e9l\u00e9brissime librairie <span style=\"color: #0000ff;\">pandas<\/span>.<span style=\"color: #0000ff;\">\u00a0<\/span>Il faudrait toutefois, penser \u00e0 convertir l&#8217;objet <span style=\"color: #0000ff;\">ndarray<\/span> en <span style=\"color: #0000ff;\">DataFrame<\/span> ou autres types d&#8217;objets de cette librairie.<\/p>\n<ul>\n<li>\n<h4>Quelques fonctions pratiques de l&#8217;<strong>Alg\u00e8bre lin\u00e9aire<\/strong><\/h4>\n<\/li>\n<\/ul>\n<p>Nous pouvons r\u00e9aliser des op\u00e9rations d&#8217;alg\u00e8bre lin\u00e9aire, comme le produit matriciel, la d\u00e9termination du d\u00e9terminant et le calcul de l&#8217;inverse d&#8217;une matrice et la d\u00e9composition de matrice. <span style=\"color: #0000ff;\">numpy<\/span> pour se faire, dispose d&#8217;un sous-module <span style=\"color: #0000ff;\">linalg<\/span>(<span style=\"color: #0000ff;\">linear algeber<\/span>, en toutes lettres). Voyons ce que ce module nous propose comme fonctions :<\/p>\n<pre class=\"lang:python decode:true \">X = np.array([[1,3,3],[1,4,3],[1,3,4]],dtype = float)\r\n# d\u00e9terminant de X\r\nnp.det(X)\r\nnp.linalg.det(X) \r\n# produit matriciel \r\nnp.dot(np.matrix(\"1 0;-1 3\"),np.matrix(\"3 1;2 1\")) \r\nnp.linalg.multi_dot([np.matrix(\"1 0;-1 3\"),np.matrix(\"3 1;2 1\")])\r\n# transpos\u00e9e d'une matrice\r\nnp.transpose(X)\r\nX.transpose()\r\nX.T\r\n# inverse d'une matrice\r\nnp.linalg.inv(X)\r\nnp.round(np.linalg.inv(X).dot(X)) # juste pour v\u00e9rifier\r\n# valeurs et vecteurs propres \r\nnp.linalg.eig(X)\r\nval.propres,vec.propres = np.linalg.eig(X) # les stockers s\u00e9parement\r\n# les autres types de produit de matrices\r\nnp.cross(np.matrix(\"1 0;-1 3\"),np.matrix(\"3 1;2 1\"))\r\nnp.inner(np.matrix(\"1 0;-1 3\"),np.matrix(\"3 1;2 1\"))\r\nnp.outer(np.matrix(\"1 0;-1 3\"),np.matrix(\"3 1;2 1\"))\r\nnp.kron(np.matrix(\"1 0;-1 3\"),np.matrix(\"3 1;2 1\"))<\/pre>\n<p>On peut maintenant \u00eatre tent\u00e9e d&#8217;appliquer quelques fonctions \u00e0 un vieux type d&#8217;exercice qui consiste \u00e0 r\u00e9soudre des syst\u00e8mes d&#8217;\u00e9quations \u00e0 plusieurs inconnues celui ci-dessous\u00a0: <\/p>\n<p class=\"ql-center-displayed-equation\" style=\"line-height: 127px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ephiquant.com\/wp-content\/ql-cache\/quicklatex.com-263d4d371f3922ee73fe41732dec3485_l3.png\" height=\"127\" width=\"241\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#091;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#99;&#97;&#115;&#101;&#115;&#125;&#45;&#50;&#120;&#43;&#121;&#45;&#122;&#43;&#53;&#119;&#45;&#50;&#118;&#61;&#49;&#49;&#92;&#92;&#32;&#120;&#43;&#51;&#121;&#43;&#50;&#122;&#45;&#51;&#119;&#43;&#50;&#118;&#61;&#51;&#49;&#92;&#92;&#45;&#120;&#43;&#52;&#121;&#43;&#56;&#122;&#45;&#55;&#119;&#43;&#53;&#118;&#61;&#54;&#52;&#92;&#92;&#52;&#120;&#45;&#50;&#121;&#43;&#53;&#122;&#43;&#51;&#119;&#43;&#118;&#32;&#61;&#55;&#54;&#92;&#92;&#53;&#120;&#43;&#55;&#121;&#45;&#51;&#122;&#43;&#51;&#119;&#43;&#50;&#118;&#61;&#56;&#56;&#32;&#92;&#101;&#110;&#100;&#123;&#99;&#97;&#115;&#101;&#115;&#125;&#32;&#92;&#093;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p>\n<p> le syst\u00e8me donn\u00e9, nous devons le r\u00e9\u00e9crire sous forme matricielle tel que \u00a0<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ephiquant.com\/wp-content\/ql-cache\/quicklatex.com-64920bed0543242b61b72f291fa6d861_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#65;&#120;&#61;&#98;\" title=\"Rendered by QuickLaTeX.com\" height=\"13\" width=\"55\" style=\"vertical-align: 0px;\"\/>\u00a0o\u00f9 :<\/p>\n<pre class=\"lang:python decode:true\">&gt;&gt;&gt; A = np.matrix(\"-2 1 -1 5 -2; 1 3 2 -3 2;-1 4 8 -7 5; 4 -2 5 3 1; 5\t7 -3 3 2\")\r\n&gt;&gt;&gt; b = np.matrix(\"11;31;64;76;88\")\r\n&gt;&gt;&gt; # Ax = b ==&gt; solution x,y,z,w,v\r\n&gt;&gt;&gt; np.linalg.inv(A).dot(b)  \r\nmatrix([[ 5.],\r\n        [ 6.],\r\n        [ 7.],\r\n        [ 8.],\r\n        [ 9.]])\r\n&gt;&gt;&gt; np.linalg.solve(A,b)\r\nmatrix([[ 5.],\r\n        [ 6.],\r\n        [ 7.],\r\n        [ 8.],\r\n        [ 9.]])<\/pre>\n<p>&nbsp;<\/p>\n<div class=\"d_reactions\" data-post-id=\"228\" data-post-url=\"https:\/\/www.ephiquant.com\/?p=228\" data-post-title=\"Numpy (Numerical Python): Les bases de la constriction\" data-post-img=\"https:\/\/www.ephiquant.com\/wp-content\/uploads\/2016\/09\/t\u00e9l\u00e9chargement.jpg\"><\/div> <!-- Check out https:\/\/reactandshare.com -->","protected":false},"excerpt":{"rendered":"<p>Si vous avez d\u00e9j\u00e0 des notions en Python, vous connaissez certainement les objets tels que les listes, les tuples, les dictionnaires &#8230;Toutefois, ces objets sont d&#8217;usage g\u00e9n\u00e9ral et manquent de maturit\u00e9 scientifiques et par dessus tout font trop recours aux [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":713,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35,34,36,27,33,26,21,28],"tags":[37,39,68,38],"class_list":["post-228","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analyse-des-donnees","category-analyse-quantitative","category-data-mining","category-data-science","category-finance","category-finance-quantitative","category-python","category-statistique","tag-calculs-numeriques","tag-matrice","tag-numpy","tag-python"],"_links":{"self":[{"href":"https:\/\/www.ephiquant.com\/index.php?rest_route=\/wp\/v2\/posts\/228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ephiquant.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ephiquant.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ephiquant.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ephiquant.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=228"}],"version-history":[{"count":31,"href":"https:\/\/www.ephiquant.com\/index.php?rest_route=\/wp\/v2\/posts\/228\/revisions"}],"predecessor-version":[{"id":614,"href":"https:\/\/www.ephiquant.com\/index.php?rest_route=\/wp\/v2\/posts\/228\/revisions\/614"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ephiquant.com\/index.php?rest_route=\/wp\/v2\/media\/713"}],"wp:attachment":[{"href":"https:\/\/www.ephiquant.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ephiquant.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ephiquant.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}