NumPy et Matplotlib

Programmation pour l’IA

Florent Capelli

Université d’Artois, CRIL

numpy

Présentation

import numpy as np

Librairie spécialisées dans le calcul numérique :

Les tableaux numpy

  • Efficacité due à plusieurs facteurs :
    • vectorisation (simd)
    • transformations implicites

Créer des tableaux

Manipuler des tableaux

La plupart des fonctions numpy peuvent être appliquées point à point sur un tableau:

Index et slices

Tableaux multidimensionnels

numpy est particulièrement efficace avec des tableaux ayant plus que 1 ou 2 dimensions.

array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.]],

       [[1., 1., 1., 1.],
        [1., 1., 1., 1.]]])

Fonctions sur plusieurs dimensions

x = np.ones((3,4))
np.sum(x)
np.sum(x,axis=1)
np.sum(x,axis=0)
  • Par défaut, sum va sommer sur toutes les entrées.
  • Avec le paramètre axis=1, on renvoie un tableau t de shape (3) tel que t[i] = ∑x[i][j]
  • Avec le paramètre axis=0, on renvoie un tableau t de shape (4) tel que t[j] = ∑x[i][j]
x = np.ones((3,4,5))
np.sum(x,axis=0)
np.sum(x,axis=(0,2))
  • Avec axis=0, on renvoie un tableau t de shape (4,5) tel que t[j][k]=sum(x[i][j][k] for i in range(3))
  • Avec axis=(0,2), on renvoie un tableau t de shape (4) tel que t[j]=sum(x[i][j][k] for i in range(3) for k in range(5))

Similaire avec np.min, np.max …

Flatten

Stack

np.stack((x1,x2...,xn)): prend des tableaux ayant la même shape (d1,...,dp) et crée un tableau t de shape (n,d1,...,dp) tel que t[i] est xi.

y = np.arange(3)
x = np.stack((y+1, y+4))
> array([[1, 2, 3],
>       [4, 5, 6]])
np.stack(x, x+6)
> array([[[ 1,  2,  3],
>         [ 4,  5,  6]],
>        [[ 7,  8,  9],
>         [10, 11, 12]]])

np.stack crée un nouveau tableau :

x=np.arange(5)
y=np.stack((x,x))
y[0][0] = 5
z=[0,1,2,3,4]
w=[z,z]
w[0][0] = 5
  • x = np.array([0,1,2,3,4])
  • y = np.array([[5, 1, 2, 3, 4], [0, 1, 2, 3, 4]])
  • z = [5,1,2,3,4]
  • w = [[5,1,2,3,4],[5,1,2,3,4]]

Roll

Fait “rouler” le tableau. Retourne une copie :

y
> array([[[ 1,  2,  3],
>        [ 4,  5,  6]],
>
>      [[ 7,  8,  9],
>        [10, 11, 12]]])    
np.roll(y, 1, axis=0)
> array([[[ 7,  8,  9],
>         [10, 11, 12]],
> 
>        [[ 1,  2,  3],
>         [ 4,  5,  6]]]) 
np.roll(y, 1, axis=1)
> array([[[ 4,  5,  6],
>         [ 1,  2,  3]],
> 
>        [[10, 11, 12],
>         [ 7,  8,  9]]])
np.roll(y, 1, axis=2)
> array([[[ 3,  1,  2],
>         [ 6,  4,  5]],
> 
>        [[ 9,  7,  8],
>         [12, 10, 11]]])

Génération aléatoire avec numpy

np.random: contient de nombreuses distributions.

Générateur pseudo-aléatoire

np.random.seed(42)
print(np.random.rand(3)) 
# toujours 0.3745401188473625
rng = np.random.default_rng(42)
print(rng.random(3))
# toujours 0.3745401188473625

Garder la seed = reproduire des expériences basées sur des générateurs pseudo-aléatoires.

matplotlib

Présentation de la librairie

Librairie pour la visualisation: diagrammes, fonctions etc.

Pour la visualisation, on va utiliser uniquement la partie pyplot de matplotlib:

import matlib.pyplot as plt

Tracer une fonction

x=np.linespace(-10,10,20)
plt.plot(x,x*x)
plt.show()
Une parabole !

Tracer une courbe paramétrée

t=np.linspace(0,2*np.pi, 100)
plt.plot(np.sin(t),np.cos(t))
plt.show()
t=np.linspace(0,2*np.pi, 100)
plt.plot(np.sin(t),np.cos(t))
plt.axis("equal")
plt.show()
Un rond ?
Un rond

Nuage de points

x=np.random.uniform(-10,10,100)
y=np.random.normal(0,2,100)
plt.scatter(x,y)
plt.show()
Nuage de point

Histogrammes

x=["A","B","C","D"]
y=[10, 20, 30, 40]
plt.bar(x,y)
plt.show()
Histogramme

Mise en page

On peut mettre en page les diagrammes :

x = np.linspace(0, 2*np.pi, 200)
y = np.sin(x)

plt.plot(x, y, 
    label='sin(x)',
    color="pink")
    
plt.xlabel('Angle (rad)')
plt.ylabel('Amplitude')
plt.title('Sinus')

plt.legend()
plt.show()
Plus joli

Couleurs

x=["Mozzarella","Gorgonzola","Scarmozza","Ricotta"]
y=[20, 5, 15, 10]
plt.bar(x,y,color=["green","red"])
plt.show()
Histogramme kitsch