• Keine Ergebnisse gefunden

Exemple 2 : Effectuer des opérations sur les listes Concaténation de listes

1.8. Etude des objets « array »

Les objets « array » sont des séquences de valeurs (uniquement numériques) se présentant sous formes de tableaux d’un ou plusieurs dimensions (vecteur ou matrice). Les arrays sont objets définis avec la fonction array() accessible à partir du module numpy (module spécialisé dans les calculs numériques sous python). Pour pouvoir donc définir un objet array, il faut, au préalable importer le module numpy comme suit :

import numpy

61

1.8.1. Définition d’un array

Les objets array sont généralement définis à partir des objets listes, tuples ou tout autre séquence de valeurs comme les range. Ceux-ci doivent être spécifiées comme argument de la fonction array().

On peut distinguer les arrays selon leur dimension : les arrays à une dimension, les arrays à deux ou plusieurs dimensions.

1.8.1.1. Définition d’un array à 1 dimension

Les exemples ci-dessous illustrent quelques cas de définition d’un array à une dimension.

import numpy # Importe le module numpy pour pouvoir utiliser la fonction array()

myList= [1,2,3, 8, 24, 12] # Crée une liste nommée myList myTuple= (0,2,3, 9, 7, 13) # Crée un tuple nommée myTuple

x= numpy.array(myList) # Crée un array à partir d’une liste, renvoie : array([ 1, 2, 3, 8, 24, 12])

y= numpy.array(myTuple) # Crée un array à partir d’un tuple, renvoie : array([ 0, 2, 3, 9, 7, 13])

z=numpy.arange(10) # Crée un array en utilisant la fonction arange().

Renvoie : array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

La fonction arange() est l’équivalent de la fonction range() pour les cas des arrays. Elle permet directement de générer un array à partir de la séquence de valeurs indiquée. Par conséquent l’expression z=numpy.arange(10) est un raccourci de l’expression suivante :

z=numpy.array(list(range(10))) # Renvoie : array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Toutefois, l’avantage de la fonction arange() par rapport à la fonction range(), c’est que celle-ci peut prendre des arguments numériques de type float ou interger alors que la fonction range() ne prend que des integers. Exemple :

z=numpy.arange(2.5,4.5, 0.5) # Array de séquence numérique compris entre 2.5 et 4.5 avec un pas de 0.5 Renvoie :array([ 2.5, 3. , 3.5, 4. ])

La différence fondamentale entre un objet array à une dimension et une liste (ou un tuple) est que celui-ci est considéré comme un vecteur. Par conséquent on peut effectuer des opérations vectorielle élément par élément. Ce qui est bien commode lorsqu’on analyse de grandes quantités de données. Exemples :

Soit le array x défini par :

62 x = numpy.arange(4) # renvoie array([0, 1, 2, 3])

x + 1 # renvoie array([1, 2, 3, 4])

x + 0.1 # renvoie array([ 0.1, 1.1, 2.1, 3.1]) x * 2 # renvoie array([0, 2, 4, 6])

x * x # renvoie array([0, 1, 4, 9])

Sur le dernier exemple de multiplication, l’array final correspond à la multiplication élément par élément des deux array initiaux. Avec les listes, ces opérations n’auraient été possibles qu’en utilisant des boucles.

1.8.1.2. Définition d’un array à plusieurs dimensions

Comme pour les listes, un array à deux dimensions se définit simplement comme array de array c'est-à-dire un array dont les éléments individuels sont constitués par des arrays. Les exemples ci-dessous illustrent quelques cas de définition d’un array à plusieurs dimensions.

Array à deux dimensions :

Pour créer un array à deux dimensions à partir d’une liste, il suffit de passer en argument une liste de listes à la fonction array(). Exemple :

myList=[[1,2,3],[2,3,4],[3,4,5]] # définition d’une liste de listes x=numpy.array(myList) # Définition d’un array d’array.

Nb: un array à deux dimensions ne veut pas dire array à deux colonnes. Il suffit simplement un array constitué de liste de liste.

Array à trois dimensions :

On peut aussi créer des tableaux à trois dimensions en passant à la fonction array() une liste de listes de listes :

myList=[[[1,2],[2,3]],[[4,5],[5,6]]] # définition d’une liste de listes

x=numpy.array(myList) # Définition d’un array d’array d’array (array à 3 dimensions).

1.8.1.3. Indiçage d’un array (slicing)

L’indiçage d’un array se fait de la même manière que dans le cas d’une liste. Les exemples ci-dessous sont des illustrations.

Cas d’un array à une dimension

x = numpy.arange(10) # Définition d’un array, renvoie array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

x[1] # renvoie l’élément d’indice 1 (correspond ici à 1)

63 x[5:] # renvoie tous les éléments à partir de l’élément d’indice 5, ici array([5, 6, 7, 8, 9])

x[: : 2] # renvoie tous les éléments avec un saut de 2 élements à chaque fois array([0, 2, 4, 6, 8])

Cas d’un array à deux dimensions

y = numpy.array([[1,2],[3,4]]) # définition d’un array à deux dimensions

y[0,:] # Sélectionne tous les éléments de l’array qui a l’indice 0 dans les arrays de second niveau, renvoie array([1, 2])

y[:,0] # sélectionne tous les éléments se trouvant à l’indice 0 dans les array de second niveau, renvoie array([1, 3])

y[1,1] # Sélectionne l’élément d’indice 1 de l’array qui a l’indice 1 dans la liste des array de second niveau, renvoie 4

1.8.2. Déterminer la dimension d’array

Pour déterminer la dimension d’un array, on utilise la fonction shape(). Voir exemple ci-dessous :

Soit le array x défini par : x = numpy.arange(3)

numpy.shape(x) # renvoie (3,) signifiant que l’array x contient trois élements

1.8.3. Les opérations sur les arrays

Cette section décrits quelques opérations couramment effectuées sur les arrays.

1.8.3.1. Conversion d’un array vectoriel en array matriciel: fonction reshape() et resize()

les fonctions reshape() et resize()permettent de transformer un array qui se présente initialement comme un vecteur en un array matriciel en indiquant le nombre de lignes et de colonnes. Les exemples ci-dessous illustrent le type de redimensionnement qu’effectue chacune de ces deux fonctions.

x = numpy.arange(9) # définit un array de 9 élements allant de 0 à 8 numpy.reshape(x,(3,3)) # Renvoie un array matriciel 3x3 en distribuant les éléments de l’array initial sur chaque ligne en revenant à la ligne quand la ligne est remplie.

numpy.resize(x,(2,2)) # Renvoie un array matriciel 2x2 en distribuant les éléments de l’array initial sur chaque ligne en revenant à la ligne quand la ligne est remplie. Il s’arrête lorsque la matrice 2x2 est remplie.

64 numpy.resize(x,(4,4)) # Renvoie un array matriciel 4x4 en distribuant les éléments de l’array initial sur chaque ligne en revenant à la ligne quand la ligne est remplie. Il continue le remplissage tant que la matrice 4x4 n’est pas totalement remplie. Le remplissage continue à partir de la première valeur de l’array initial.

Nb : La fonction reshape() nécessite que la dimension de la matrice indiquée soit compatible avec le nombre d’éléments contenus dans l’array de départ. Ce qui n’est pas obligatoire pour la fonction que resize() qui puise les valeurs en recommençant à partir du premier élément de l’array initial. Et lorsque la dimension de la matrice est plus petite que la dimension de l’array de départ, le remplissage avec la fonction resize() s’arrête lorsque le remplissage de la matrice est complet. Pour le cas de la fonction reshape, celle-ci renvoie une erreur.

1.8.3.2. Transposé d'un array matriciel: fonction transpose()

la fonction transpose() renvoie la transposée d’un array. Par exemple pour une matrice : x = numpy.arange(9) # génère un array

y=numpy.reshape(x,(3,3)) # tranforme l’array en un array matriciel 3x3 z=numpy.transpose(y) # Effectue la transposée de la matrice y

1.8.3.3. Création d'un array matriciel rempli de 0 ou 1: fonctions zeros() et ones()

Les fonctions zeros() et ones() permettent de construire des objets array contenant des 0 ou de 1, respectivement. Pour cela, il faut leur passer un tuple indiquant la dimensionnalité voulue.

Les exemples ci-dessus sont illustrations.

numpy.zeros((3,3)) # Crée un array matriciel de dimension 3x3 rempli de 0 (de type float)

numpy.zeros((3,3),int) # Crée un array matriciel de dimension 3x3 rempli de 0 (de type integer)

numpy.ones((3,3)) # Crée un array matriciel de dimension 3x3 rempli de 0 (de type float)

numpy.ones((3,3), int) # Crée un array matriciel de dimension 3x3 rempli de 0 (de type float)

Nb : Par défaut, les fonctions zeros() et ones() génèrent des réels (float), mais on peut modifier ce comportement en demandant par exemple des entiers en passant l’option int en second argument.

1.8.3.4. Les opérations algébriques (matricielles) sur les arrays

65 Les arrays étant par définitions des objets vectoriels ou matriciels, on peut effectuer des opérations algébriques comme le produit matriciel, le calcul de déterminant, l’inversion de matrice, etc… Dans la plupart de ces opérations, on utilisera la fonction linalg du module numpy. Les exemples ci-dessous sont des illustrations.

Soit l’array matriciel x défini comme suit :

x = numpy.resize(numpy.arange(4),(2,2)) # génère un array matriciel On peut effectuer les opérations algébriques suivantes :

x2=numpy.dot(a,a) # renvoie le produit matriciel entre x et x alors x*x aurait renvoyé le produit élément par élément.

numpy.linalg.inv(x) # renvoie l’inverse de la matrice x numpy.linalg.det(x) # renvoie le déterminant de la matrice x

numpy.linalg.eig(x) # renvoie un tuple dont le premier élément correspond aux valeurs propres et le second élément aux vecteurs propres.

Pour avoir plus de détails sur la fonction linalg, consulter la page suivante : http://docs.scipy.org/doc/numpy/reference/routines.linalg.html

1.8.3.5. Utilisation de la fonction argsort() sur un array

La fonction argsort() renvoie sous forme de liste (ou d’array) les indices qui auraient trier u l’array qui a été fournit en arguement. Exemple :

x = numpy.array([1.48,1.41,0.0,0.1]) # Crée un array print (x.argsort()) # renvoie [2 3 1 0]

[2, 3, 1, 0] indique que l'élément le plus petit est à l'index 2, le suivant le plus petit à l'index 3, puis l'indice 1, puis le plus grand est à l'indice 0. La fonction renvoie donc les indices plutôt que les valeurs.