Tutoriel Python & Numpy : les types de données

Table des matières

Introduction

  1. Types de données
  2. Conversion de type de données
  3. Exercices
  4. Correction

Conclusion

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.

  1. 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 (intint8i>i4, float, f, etc.) ainsi que comment convertir le type de données d’un tableau en un autre.

Article publié le 29 Octobre 2020 par Imane BENHMIDOU