Skip to article frontmatterSkip to article content
import numpy as np

contenu de ce notebook (sauter si déjà acquis)

ce notebook détaille les fonctions numpy qui combinent les éléments d’un tableau
comme numpy.sum, numpy.var...

comment on utilise leur paramètre axis

introduction

# le code
tab1 = np.arange(10).reshape(2, 5)

np.mean(tab1)
np.float64(4.5)
tab1.mean()
np.float64(4.5)

agrégation en dimension 1

exemple avec des vecteurs d’entiers

# le code
vec = np.random.randint(1, 10, size=(10,))
print(vec)
print(np.min(vec, axis=0), np.max(vec), np.sum(vec), np.std(vec))
print(vec.min(), vec.max(), vec.sum(), vec.std())
[6 3 3 8 2 3 9 1 2 8]
1 9 45 2.80178514522438
1 9 45 2.80178514522438
# le code
vec = np.array([0, 1], dtype=np.int8)
type(np.min(vec))
numpy.int8

exemple avec un vecteur de booléens

# le code
tab = np.random.randint(0, 2, size=(10), dtype=bool)
print(np.all(tab), np.any(tab))
print(tab.all(), tab.any())
print(tab.sum() == len(tab), tab.sum() != 0)
print(np.all(np.random.randint(1, 2, size=(10), dtype=bool))) # tous des 1
False True
False True
False True
True

exercice : programmer la version “pédestre”

  1. créez une fonction manuelle (sans utiliser np.all et np.any) qui prend un tableau numpy de booléens en paramètre et détermine si tous les éléments du tableau sont vrais.

  2. créez une fonction manuelle (sans utiliser np.all et np.any) qui prend un tableau numpy de booléens en paramètre et détermine si tous les éléments du tableau sont faux.

# votre code
def fake_all(tab):
    pass
def fake_none(tab):
    pass

agrégation en dimension > 1

exemple de tableau en dim 4


somme en dimension 4

tab = np.arange(120).reshape(2, 3, 4, 5)

(tab.sum(axis=0).shape == (3, 4, 5),
 tab.sum(axis=1).shape == (2, 4, 5),
 tab.sum(axis=2).shape == (2, 3, 5),
 tab.sum(axis=3).shape == (2, 3, 4))
(True, True, True, True)
tab.sum(axis=0)
array([[[ 60, 62, 64, 66, 68], [ 70, 72, 74, 76, 78], [ 80, 82, 84, 86, 88], [ 90, 92, 94, 96, 98]], [[100, 102, 104, 106, 108], [110, 112, 114, 116, 118], [120, 122, 124, 126, 128], [130, 132, 134, 136, 138]], [[140, 142, 144, 146, 148], [150, 152, 154, 156, 158], [160, 162, 164, 166, 168], [170, 172, 174, 176, 178]]])

pour les usages (trés) avancés, remarquons qu’on pourrait même passer comme axis plusieurs dimensions

par exemple

tab.sum(axis=(1, 2))

on généralise simplement: au lieu de faire la somme le long d’une droite, ici on va faire la somme sur un plan

et de la même façon qu’en faisant sum(axis=0) on était passé d’une entrée de shape (2, 3, 4, 5) à une sortie de shape (3, 4, 5)

eh bien la shape de tab.sum(axis=(1, 2)) va être (2, 5); les deux dimensions centrales, puisqu’on les a ‘consommées’ pour faire la somme, ont disparu du résultat

# le code
tab.sum(axis=(1, 2))
array([[ 330, 342, 354, 366, 378], [1050, 1062, 1074, 1086, 1098]])

min et max globaux en dimension 4

# le code
tab = np.arange(120).reshape(2, 3, 4, 5)
print(    tab.argmax()    )

print(    np.unravel_index(tab.argmax(), tab.shape)    )
119
(np.int64(1), np.int64(2), np.int64(3), np.int64(4))

exercice avancé

  1. proposez le code de la fonction np.unravel_index
# votre code ici
def unravel_index(index, shape):
    pass
# devrait retourner [1, 2, 0, 4]
unravel_index(104, (2, 3, 4, 5))