Résultat de l'exécution


Numpy

Numpy pour Numerical Python est une librairie liée au calcul scientifique et qui permet de traiter efficacement les données sous forme de tableaux à une ou deux dimensions.

Pour l'utiliser il faut l'avoir installée sous Python en utilisant pip ou conda (pour la version Anaconda de Python).

On doit ensuite déclarer la librairie dans le fichier Python que l'on va créer afin de pouvoir en utiliser les fonctionnalités :

import numpy as np

Dès lors, il faudra préfixer toutes les fonctions de numpy par np.

Le lien suivant donne accès à la documentation.

Note

Les codes python présents sur cette page peuvent être exécutés en appuyant sur le bouton Exécute situé en dessous de chacun d'entre eux. Le code sera exécuté sur une machine personnelle à mon domicile sauf si elle est éteinte, dans ce cas un message d'erreur vous alertera de l'impossibilité de l'exécution.

Le résultat de l'exécution sera affiché dans la fenêtre prévue à cet effet sur cette page.

Tableaux à une dimension

Création de tableaux

création à partir de liste

On peut créer un tableau en donnant sa liste de valeurs. Dans l'exemple qui suit on crée un tableau à une dimension composé de quatre valeurs, puis on affiche différents éléments du tableau ainsi que des propriétés :

  1. import numpy as np
  2.  
  3. # definition
  4. tableau = np.array( [10, 11, 12, 13] )
  5.  
  6. # affiche le tableau
  7. print("tableau = ", tableau)
  8.  
  9. # affiche le premier et le second élément
  10. print("tableau[0] = ", tableau[0])
  11. print("tableau[1] = ", tableau[1])
  12.  
  13. print("nombre d'éléments = ", tableau.size)
  14.  
  15. print("nombre de dimensions = ",  tableau.ndim)
  16.  
  17. print("dimension(s) = ", tableau.shape)
  18. print("taille première dimension =", tableau.shape[0])

Un tableau numpy possède les propriétés suivantes :

tableau de 1 ou de 0

On peut créer un tableau avec les fonctions ones qui crée un tableau de 1, ou zeros qui crée un tableau de 0 :

  1. import numpy as np
  2.  
  3. # tableau composé de 5 fois la valeur 0.0 (réel/flottant)
  4. tableau_reels = np.zeros(5)
  5. print(tableau_reels)
  6.  
  7. # tableau composé de 5 fois la valeur 0 (entier)
  8. # on précise ici le type de représentation qui sera 'int'
  9. tableau_entiers = np.zeros(5, dtype=int)
  10. print(tableau_entiers)
  11.  
  12. # tableau de 15 entiers initialisés à 1 (entier)
  13. tableau_entiers = np.ones(15, dtype=int)
  14. print(tableau_entiers)

Pour créer un tableau avec valeur initiale, on peut procéder de deux manières différentes :

  1. import numpy as np
  2.  
  3. tableau_reels = np.ones(10)
  4. tableau_reels *= 7
  5. print(tableau_reels)
  6.  
  7. tableau_reels = np.full(10, 7.0)
  8. print(tableau_reels)

création à partir de séquence

Pour créer un tableau avec des valeurs croissantes (ou décroissantes), on utilise arange :

  1. import numpy as np
  2.  
  3. tableau_entiers = np.arange(1,10)
  4. print(tableau_entiers)
  5.  
  6. tableau_entiers = np.arange(1,30,3)
  7. print(tableau_entiers)
  8.  
  9. tableau_entiers = np.arange(start = 1, stop = 30, step = 3)
  10. print(tableau_entiers)

création de tableau contenant des valeurs aléatoires

Pour créer un tableau avec des valeurs aléatoires, on utilise random :

  1. import numpy as np
  2.  
  3. # créer un tableau de 10 valeurs comprises dans [0, 1.0[
  4. tableau_alatoire_reels = np.random.random( 10 )
  5. print(tableau_alatoire_reels)
  6.  
  7. # créer un tableau de 10 valeurs entières comprises
  8. # entre -7 et 7
  9. tableau_alatoire_entiers = np.random.randint(-7, 8, 10)
  10. print(tableau_alatoire_entiers)

Modification de tableaux

ajout en fin

Pour ajouter une valeur à la fin du tableau, on utilise append. Attention, cependant, car il faut réassigner le tableau modifié au tableau initial.

  1. import numpy as np
  2.  
  3. tableau_entiers = np.array([1,2,3])
  4. print(tableau_entiers)
  5.  
  6. # modification non prise en compte
  7. np.append(tableau_entiers, 4)
  8. print(tableau_entiers)
  9.  
  10. # prise en compte de la valeur en réassignant le tableau
  11. tableau_entiers = np.append(tableau_entiers, 4)
  12. print(tableau_entiers)

ajout au milieu ou au début

Pour insérer une valeur on utilise insert. Attention, cependant, car il faut réassigner le tableau modifié au tableau initial.

  1. import numpy as np
  2.  
  3. tableau_entiers = np.array([1,2,3,4,5,6])
  4. print(tableau_entiers)
  5.  
  6. tableau_entiers = np.insert(tableau_entiers, 3, -7)
  7. print(tableau_entiers)
  8.  
  9. tableau_entiers = np.insert(tableau_entiers, 0, -3)
  10. print(tableau_entiers)

suppression

Pour supprimer une valeur on utilise delete. Attention, cependant, car il faut réassigner le tableau modifié au tableau initial.

  1. import numpy as np
  2.  
  3. tableau_entiers = np.array([1,2,3,4,5,6])
  4. print(tableau_entiers)
  5.  
  6. tableau_entiers = np.delete(tableau_entiers, 3)
  7. print(tableau_entiers)

Recherche et extraction

Le slicing consiste à prendre une partie d'un tableau en indiquant les indices que l'on sélectionne dans une plage de valeurs :

  1. import numpy as np
  2.  
  3. tableau_entiers = np.array([10,11,12,13,14,15,16,17,18])
  4.  
  5. print(tableau_entiers[2:5])
  6.  
  7. print(tableau_entiers[:3])
  8.  
  9. print(tableau_entiers[-2:])

La recherche de valeurs se fait grâce à where qui donne une liste des indices qui correspondent à un critère de recherche donné :

  1. import numpy as np
  2.  
  3. tableau_entiers = np.array([1,2,3,4,5,6,5,6,5,3])
  4. indices = np.where(tableau_entiers == 5)
  5. print(indices[0])

La sélection de valeurs peut également se faire avec les formulations suivantes si on a un critère de sélection avec plusieurs conditions à remplir :

  1. import numpy as np
  2.  
  3. # première méthode
  4. # condition entre crochets du tableau
  5. tableau_entiers = np.arange(1,30,2)
  6. print(tableau_entiers)
  7. nouveau_tableau = tableau_entiers[(tableau_entiers > 10) & (tableau_entiers <= 15)]
  8. print(nouveau_tableau)
  9.  
  10. # deuxième méthode
  11. # choix des indices correspondant aux critères
  12. selection = (tableau_entiers > 10) & (tableau_entiers <= 15)
  13. nouveau_tableau = tableau_entiers[ selection ]
  14. print(nouveau_tableau)

Appliquer une fonction à un tableau

  1. import numpy as np
  2.  
  3. # fonction à appliquer
  4. def carre(x):
  5.     return x*x
  6.  
  7. # fonction vectorisée (qui peut s'appliquer en parallèle sur
  8. # chacun des éléments d'un tableau)
  9. vec_carre = np.vectorize(carre)
  10.  
  11. tableau_entiers = np.array([10,11,12,13,14,15,16,17,18])
  12.  
  13. tableau_entiers = vec_carre(tableau_entiers)
  14.  
  15. print(tableau_entiers)

Tableaux à deux dimensions

Création de tableaux

On peut créer une matrice (tableau à deux dimensions) de plusieurs manières différentes :

  1. import numpy as np
  2.  
  3. # définition avec lignes
  4. matrice_entiers = np.array([[11,12,13,14],[21,22,23,24]])
  5.  
  6. # ou liste de valeurs et reshape
  7. matrice_entiers = np.array([11,12,13,14,21,22,23,24]).reshape(2,4)
  8.  
  9. print(matrice_entiers)
  10. print(matrice_entiers.shape)
  11. print("dimension sur y=", matrice_entiers.shape[0])
  12. print("dimension sur x=", matrice_entiers.shape[1])
  13. print("nombre d'éléments=", matrice_entiers.size)
  14. print("première ligne=", matrice_entiers[0])
  15. print("deuxième ligne=", matrice_entiers[1])
  16. print(matrice_entiers[0][2])

On peut également utiliser ones ou zeros :

  1. import numpy as np
  2.  
  3. matrice_entiers = np.ones((5,3))
  4.  
  5. print(matrice_entiers)
  6. print(matrice_entiers.shape)
  7. print("dimension sur y=", matrice_entiers.shape[0])
  8. print("dimension sur x=", matrice_entiers.shape[1])
  9. print("nombre d'éléments=", matrice_entiers.size)
  10. print("première ligne=", matrice_entiers[0])
  11. print("deuxième ligne=", matrice_entiers[1])
  12. print(matrice_entiers[0][2])
  13.  
  14.  
  15. id_ligne = 0
  16. for ligne in matrice_entiers:
  17.     print("ligne ", id_ligne, " : ", ligne)
  18.     id_ligne += 1

Il existe la fonction eye qui crée la matrice identité :

  1. import numpy as np
  2.  
  3. matrice_entiers = np.eye(5)
  4.  
  5. print(matrice_entiers)
  6. print(matrice_entiers.shape)
  7. print("dimension sur y=", matrice_entiers.shape[0])
  8. print("dimension sur x=", matrice_entiers.shape[1])
  9. print("nombre d'éléments=", matrice_entiers.size)
  10. print("première ligne=", matrice_entiers[0])
  11. print("deuxième ligne=", matrice_entiers[1])
  12. print(matrice_entiers[0][2])
  13. matrice_entiers[0][2] = -777
  14.  
  15. id_ligne = 0
  16. for ligne in matrice_entiers:
  17.     print("ligne ", id_ligne, " : ", ligne)
  18.     id_ligne += 1

Modification de matrices

Ajouter une colonne à une matrice :

  1. import numpy as np
  2.  
  3. matrice_entiers = np.ones((5,3))
  4. colonne = np.array([8,9,10,11,12]).reshape(5,1)
  5. matrice_entiers = np.append(matrice_entiers, colonne, axis=1 )
  6.  
  7. print(matrice_entiers)

Insérer une ligne dans une matrice :

  1.  
  2. import numpy as np
  3.  
  4. matrice_entiers = np.ones((5,3))
  5. colonne = np.arange(1,4)
  6. matrice_entiers = np.insert(matrice_entiers, 1, colonne, axis=0 )
  7.  
  8. print(matrice_entiers)

Insérer une colonne dans une matrice :

  1. import numpy as np
  2.  
  3. matrice_entiers = np.ones((5,3))
  4. colonne = np.arange(1,6)
  5. matrice_entiers = np.insert(matrice_entiers, 1, colonne, axis=1 )
  6.  
  7. print(matrice_entiers)

Supprimer une ligne dans une matrice :

  1. import numpy as np
  2.  
  3. matrice_entiers = np.arange(1,16).reshape(5,3)
  4. print(matrice_entiers)
  5.  
  6. matrice_entiers = np.delete(matrice_entiers, 1, axis=0)
  7. print(matrice_entiers)

Supprimer une colonne dans une matrice :

  1. import numpy as np
  2.  
  3. matrice_entiers = np.arange(1,16).reshape(5,3)
  4. print(matrice_entiers)
  5.  
  6. matrice_entiers = np.delete(matrice_entiers, 1, axis=1)
  7. print(matrice_entiers)

1.1. Exercices

Exercice 1.1

  • générer un vecteur $X$ de valeurs dans l'intervalle [1,3[ par pas de 0.5 en utilisant numpy.arange
  • générer un vecteur $Y$ de valeurs dans l'intervalle [3,1[ par pas de -0.5 en utilisant numpy.arange
  • réaliser la somme des vecteurs $Z = X + Y$ puis l'afficher
  • appliquer la racine carrée sur le vecteur $Z$ et afficher le résultat
X= [1.  1.5 2.  2.5]
Y= [3.  2.5 2.  1.5]
Z=X+Y= [4. 4. 4. 4.]
Z=sqrt(Z)= [2. 2. 2. 2.]

Exercice 1.2

  • créer une matrice $M1$ de dimensions (3,5) avec des valeurs dans l'intervalle [1,15]
  • créer une matrice $M2$ de dimensions (5,3) avec des valeurs dans l'intervalle [15,1]
  • réaliser le produit $M_3 = M_1 × M_2$ puis l'afficher
  • calculer la transposée $M_4 = M_3^t$ puis l'afficher
  • afficher la somme des valeurs de $M_4$
M1= [[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]]
M2= [[15 14 13]
 [12 11 10]
 [ 9  8  7]
 [ 6  5  4]
 [ 3  2  1]]
M3= [[105  90  75]
 [330 290 250]
 [555 490 425]]
M4= [[105 330 555]
 [ 90 290 490]
 [ 75 250 425]] 
sum = 2610 

Exercice 1.3

A partir de la matrice suivante de taille (5,3), ajouter la colonne 4 composée de [1,3,5,7,9] et la colonne 5 composée de [2,4,6,8,10].

  1. matrice_entiers = np.ones((5,3))

On veut donc obtenir :

[[ 1.  1.  1.  1.  2.]
 [ 1.  1.  1.  3.  4.]
 [ 1.  1.  1.  5.  6.]
 [ 1.  1.  1.  7.  8.]
 [ 1.  1.  1.  9. 10.]]

Exercice 1.4

  • Générer un vecteur $X$ de 10 valeurs aléatoires comprises entre 1.0 et 10.0 en utilisant numpy.random.uniform
  • Générer un vecteur $Y$ de booléens qui indique si $X[i]$ est compris entre 1.0 et 5.0
  • Créer un vecteur $Z$ qui sélectionne les valeurs de $X$ à partir de $Y$

On veut donc obtenir :

X= [9.81902182 1.43352921 7.92413626 2.98401466 9.46288322 4.24775828
 6.50744638 6.7438592  7.41775024 6.80153364]
Y= [False  True False  True False  True False False False False]
Z= [1.43352921 2.98401466 4.24775828]

Exercice 1.5

Récupérer les données des Iris et créer trois matrices numpy avec les données des sépales et pétales pour chaque espèce (virginica, setosa, versicolor) :

import numpy as np 

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
# sepal length, sepal width, petal lenth, petal width, species
sl,sw,pl,pw,sp = np.loadtxt(url, delimiter=',', dtype = "float,float,float,float,S20", unpack=True)

# créer un tableau avec les données numériques
iris = np.column_stack([sl,sw,pl,pw])
iris.astype(np.float64)
print(iris)

# isoler les données pour chaque espèce en utilisant sp
virginica = ?
versicolor = ?
setosa = ?

Exercice 1.6

Reprendre l'exercice précédent et afficher le minimum, maximum, la moyenne et l'écart type pour chacune des espèces concernant la longueur des pétales.