Tutoriel Python & Numpy : les types de données
Rédigé par Imane BENHMIDOU, Publié le 29 Octobre 2020, Mise à jour le Dimanche, 22 Novembre 2020 01:52
Table des matières
Introduction
NumPy (Numerical Python) est une extension fondamentale de Python qui permet de faire du calcul scientifique en Python et qui est construite à base du langage de programmation C.
NumPy offre un plus grand nombre de types de données que le langage Python en lui-même et qui sont similaires à ceux en langage C. Ce qui fera le sujet du présent tutoriel.
1. Types de données
Dans Python on retrouve les types de données de base suivants : entier, flottant, booléen et complexe.
En revanche dans la bibliothèque NumPy on retrouve des types de données, dont le nom comprend des numéros indiquant leur taille de bit, c’est-à-dire combien de bits sont nécessaires pour représenter une seule valeur en mémoire.
Le tableau suivant regroupe les types de données de NumPy.
TYPE DE DONNÉES NUMPY |
DESCRIPTION |
Bool_ |
Booléen stocké sous forme d’un octet. |
byte |
Entier signé, alias int8. |
ubyte |
Entier non signé, alias uint8. |
int8 |
Entier signé sur 8 bits. |
int16 |
Entier signé sur 16 bits. |
int32 |
Entier signé sur 32 bits. |
int64 |
Entier signé sur 64 bits. |
uint8 |
Entier non signé sur 8 bits. |
uint16 |
Entier non signé sur 16 bits. |
uint32 |
Entier non signé sur 32 bits. |
uint64 |
Entier non signé sur 64 bits. |
float16 |
Nombre à virgule flottante sur 16 bits. |
float32 |
Nombre à virgule flottante sur 32 bits. |
float64 |
Nombre à virgule flottante sur 64 bits. |
complex64 |
Nombre complexe sur 64 bits. |
complex128 |
Nombre complexe sur 128 bits. |
Un objet de type dtype représente l’interprétation d’un bloc de mémoire fixe alloué à un tableau en prenant en considération le type des données, la taille des données, l’ordre des octets, si le type des données est structuré, le nom des champs, le type des données de chacun et la partie du bloc de mémoire occupée par chacun et si le type des données est un sous-tableau, sa forme et son type de donnée.
L’ordre des données est spécifié en ajoutant soit « < » soit « > »au début du type de donnée :
- « < » pour l’encodage little endian.
- « > » pour l’encodage big endian.
Pour créer un tableau d’un certain type de données ou convertir des nombres ou des séquences Python en tableaux de ce type, on peut faire appel au mot clé dtype accepté par plusieurs fonctions et méthodes de la bibliothèque NumPy.
Exemple 1 :
Pour créer un tableau d’un certain type de données on peut procéder de deux manières.
Méthode 1 :
Définition du type de données du tableau par une constante de type chaîne de caractères.
- Code :
import numpy as np
a1 = np.array( [1,2,3], dtype = 'int64')
print( a1)
- Résultat de l’exécution :
Méthode 2 :
Définition du type de données du tableau par une donnée dans la bibliothèque NumPy.
- Code :
a2 = np.array( [1,2,3], dtype = np.int64)
print(a2)
- Résultat de l’exécution :
Exemple 2 :
Dans cet exemple on utilise la fonction arange pour créer un tableau contenant des données de type entier signé 8 bits (int8).
- Code :
b = np.arange(8, dtype = np.int8)
print(b)
- Résultat de l’exécution :
Les types de données peuvent également être exprimés sous la forme suivante :
- I pour les entiers signés.
- U pour les entiers non signés.
- F pour les flottants.
- S pour les chaines de caractères.
Exemple 3 :
Dans cet exemple on crée un tableau dont les données sont de type entier sur 4 octets.
- Code :
c = np.array([8,9,10], dtype = 'i4')
print(c.dtype)
- Résultat de l’exécution :
Exemple 4 :
On crée dans cet exemple un tableau dont les données sont de type string.
- Code :
c = np.array(['nom','prenom','age'], dtype = 'S')
print(c.dtype)
- Résultat de l’exécution :
Exemple 5 :
Dans cet exemple nous avons utilisé le type de données float de Python car NumPy connait à l’avance que float est équivalent à np.float_. Ainsi int est équivalent à np.int_, bool est équivalent à np.bool_ et complexest équivalent à np.complex_.
- Code :
e = np.array([1,7,3], dtype = float)
print(e)
- Résultat de l’exécution :
Remarque :
Les autres types de données NumPy n’ont pas d’équivalent en Python.
Exemple 6 :
Dans cet exemple on utilise la notation endian.
- Code :
tableau = np.array([1,4,5], dtype = '>i4')
print(tableau)
print(tableau.dtype)
- Résultat de l’exécution :
Exemple 7 :
Dans exemple ci-dessous on définit un type de données structurées appelé employé avec un champ « nom » de type chaine de caractères, un champ « âge » de type entier et un champ « salaire » de type flottant. Puis on crée une instance a de type employé.
- Code :
employé = np.dtype([('nom','S'), ('age', 'i'), ('salaire', 'f')])
a = np.array([('ahmed alaoui', 30, 8000), ('ichrak mansour', 25, 10000)],
dtype = employé)
print(a)
print(a.dtype)
- Résultat de l’exécution :
2. Conversion de type de données
Afin de changer le type des éléments d’un tableau en un autre, on fait appel à la méthode astype().
Exemple 8 :
Dans cet exemple on convertit un tableau de données de type entier sur 8 octets en des flottants sur 8 octets.
- Code :
a1 = np.array([1,2,3], dtype = 'int64')
print(a1)
a = a1.astype('float64')
print(a)
- Résultat de l’exécution :
Exemple 9 :
Dans cet exemple on convertit un tableau de données de type flottant en un tableau de type entier en utilisant uniquement i comme paramètre.
- Code :
e = np.array([1,7,3], dtype = float)
print(e)
e_entier = e.astype('i')
print(e_entier)
- Résultat de l’exécution :
Exemple 10 :
Dans cet exemple on change le type de données du tableau d’entier en booléen.
- Code :
e = np.array( [1,7,3], dtype = float)
print(e)
e_entier = e.astype( bool)
print( e_entier )
- Résultat de l’exécution :
Exemple 11 :
Dans cet exemple la chaine de caractères ‘tomate’ ne peut pas être convertie en un nombre entier ce qui lève l’erreur illustrée dans le résultat de l’exécution ci-après :
- Code :
d = np.array( [5, 'tomate',7 ], dtype = 'i')
- Résultat de l’exécution :
La conversion de type de données peut également être effectuée en utilisant le type de données comme fonction.
Exemple 12 :
- Code :
e = np.array( [1,7,3], dtype = np.int8)
print(e)
np.float32(e)
- Résultat de l’exécution :
Remarque :
Il est recommandé d’utiliser laméthode astype() pour effectuer les conversions de type de données.
Afin de déterminer le type des données d’un tableau on peut faire appel à l’attribut dtype.
Exemple 13 :
On affiche dans cet exemple le type de données du tableau.
- Code :
e = np.array( [1,7,3], dtype = float)
print( e.dtype)
- Résultat de l’exécution :
3. Exercices
Exercice 1 :
Ecrire un programme qui affiche une matrice d’entiers de dimensions 8x8 remplie avec un motif en damier.
Exercice 2 :
Ecrire un programme qui affiche une matrice contenant toutes les dates correspondant au mois d’Octobre 2020.
Exercice 3 :
Ecrire une fonction qui génère un entier a choisi au hasard de l’intervalle [0,50] et construit un tableau d’éléments de l’intervalle [0, a].
Exercice 4 :
Ecrire un programme qui affiche les valeurs représentables minimales et maximales pour chaque type scalaire sur NumPy.
4. Correction
Exercice 1 :
Dans cet exercice on affiche une matrice de type entier contenant des uns et des zéros en motif en damier.
- Code :
motif_damier = np.zeros( (8,8),dtype = int)
motif_damier[1::2,::2] = 1
motif_damier[::2,1::2] = 1
print( motif_damier )
- Résultat de l’exécution :
Exercice 2 :
Dans cet exemple on affiche une matrice de type date qui contient toutes les dates du mois d’Octobre 2020.
- Code :
matrice_date = np.arange('2020-10', '2020-11', dtype = 'datetime64[D]')
print( matrice_date )
- Résultat de l’exécution :
Exemple 3 :
Dans cet exercice on a créé une fonction qui génère un entier a au hasard de l’intervalle [0,50] et construit un tableau d’éléments de l’intervalle [0, a] à l’aide de la fonction fromiter() qui sert à créer un nouveau tableau unidimensionnel à partir d'un objet itérable.
- Code :
from random import *
def au_hasard():
a = randint(0,50)
print(a)
for x in range(a):
yield x
tableau = np.fromiter( au_hasard(), dtype = int, count = -1)
print( tableau )
- Résultat de l’exécution :
Exercice 4 :
Dans cet exercice on affiche les valeurs représentables minimales et maximales pour chaque type scalaire sur NumPy.
- Code :
for datatype in [np.int8, np.int32, np.int64]:
print( datatype )
print( np.iinfo( datatype ).min)
print( np.iinfo( datatype ).max)
for datatype in [np.float32, np.float64]:
print( datatype )
print( np.finfo( datatype ).min)
print( np.finfo( datatype ).max)
print( np.finfo( datatype ).eps)
- Résultat de l’exécution :
Conclusion
Dans ce tutoriel nous avons vu que l’extension NumPy de Python offre une variété de types de données plus vagues que celle offerte par le langage Python lui-même. Nous avons aussi vu multiples exemples pour spécifier un type de données (int, int8, i, >i4, float, f, etc.) ainsi que comment convertir le type de données d’un tableau en un autre.