contenu de ce notebook (sauter si déjà acquis)¶
la taille (en nombre d’octets) des éléments d’un numpy.ndarray
existant est constante
une modification peut causer une conversion de la valeur ou une erreur
calculs de temps d’exécution avec %timeit
rappels¶
import numpy as np
tableaux multi-dimensionnels numpy
¶
création d’un tableau multi-dimensionnel¶
le code
matrice = [
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]
]
mat = np.array(matrice)
print(mat)
print(type(mat))
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]
[16 17 18 19 20]]
<class 'numpy.ndarray'>
type et taille mémoire des éléments du tableau¶
# le code
matrice = [
[1, 2, 3],
[4, 5, 6]
]
mat = np.array(matrice)
mat.dtype, mat.itemsize, mat.nbytes
(dtype('int64'), 8, 48)
taille, forme, dimension du tableau¶
# le code
print(mat.shape)
print(mat.size, mat.shape[0] * mat.shape[1])
print(mat.ndim, len(mat.shape))
(2, 3)
6 6
2 2
création d’un tableau avec le type des éléments¶
# le code
matrice = [
[-128, -78, -32],
[17, 5, 127]
]
mat = np.array(matrice)
print(mat.min(), mat.max())
print(mat.dtype)
-128 127
int64
# le code avec type
matrice = [
[-128, -78, -32],
[17, 5, 127]
]
mat = np.array(matrice, dtype=np.int8)
mat
array([[-128, -78, -32],
[ 17, 5, 127]], dtype=int8)
# le code avec erreur
matrice = [
[-128, -78, -32],
[17, 5, 127]
]
try:
mat = np.array(matrice, dtype=np.uint8)
# soit affichage du tableau avec les négatifs convertis implicitement par complément à 2
# soit échec: "Python integer -128 out of bounds for uint8"
mat
except OverflowError as e:
print(e)
Python integer -128 out of bounds for uint8
exercice
- créez un tableau pour stocker la matrice ci-dessous avec le plus petit type entier non signé
l = [[ 0, 8, 34, 8],
[255, 61, 128, 254]]
# votre code ici
modifier le type des éléments d’un tableau existant¶
# le code
l = [[ 0, 8, 34, 8],
[255, 61, 128, 254]]
mat = np.array(l)
print( mat )
mat1 = mat.astype(np.int8) # des conversions sont effectuées
print( mat1 )
print( mat )
[[ 0 8 34 8]
[255 61 128 254]]
[[ 0 8 34 8]
[ -1 61 -128 -2]]
[[ 0 8 34 8]
[255 61 128 254]]
numpy
calcule à taille constante¶
# le code
l = [-1, 2, 3]
mat = np.array(l) # vous laissez numpy inférer le type
print( mat )
print( mat*100 )
print( mat.dtype )
[-1 2 3]
[-100 200 300]
int64
# le code
l = [-1, 2, 3]
mat = np.array(l, np.int8) # vous imposez le type
print( mat )
print( mat*100 )
[-1 2 3]
[-100 -56 44]
autres constructeurs de numpy.ndarray
¶
tableau de zéros numpy.zeros
¶
# le code
zorro = np.zeros(shape=(4, 5))
zorro
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
# le second code
zorro1 = np.zeros(shape=(4, 5), dtype=np.uint64)
zorro1
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]], dtype=uint64)
# votre code ici
tableau non-initialisé numpy.empty
¶
exercice
- créez un tableau de forme
(3, 5)
de valeurs non-initialisées
de type entiers signés sur 8 bits - affichez-le
- que contient-il ?
# votre code ici
tableau de valeurs régulièrement espacées¶
# exemple avec arange
# comme avec le range() de Python
# la deuxième borne est exclue
np.arange(0, 5)
array([0, 1, 2, 3, 4])
# exemple avec linspace
from matplotlib import pyplot as plt
X = np.linspace(-np.pi, np.pi, 30)
Y = np.sin(X)
plt.plot(X, Y)

# pour éviter l'affichage superflu, ajoutez un ;
plt.plot(X, Y);

tableaux de valeurs aléatoires¶
générateur de valeurs aléatoires entières¶
# le code
borne_inf = 10
borne_sup = 20
np.random.randint(borne_inf, borne_sup)
15
# le code
np.random.randint(10, 20, size=(2, 3, 5))
array([[[17, 18, 17, 10, 12],
[10, 15, 17, 13, 16],
[14, 19, 14, 18, 12]],
[[19, 13, 17, 15, 11],
[19, 14, 18, 10, 10],
[14, 19, 11, 19, 17]]])
générateur de valeurs aléatoires réelles¶
# le code
np.random.rand()
0.5071736138934126
# le code
np.random.randn(2, 3, 1)
array([[[-1.13883641],
[ 0.01680743],
[ 0.73579143]],
[[-0.43809415],
[-0.26126171],
[ 0.05268127]]])
exercice génération aléatoire et affichage couleur
avec la fonction numpy.random.randint
dont l’aide est obtenue en tapant
np.random.randint?
construisez une image de
10 x 10
pixels en format RBG
i.e. chaque pixel est composé de 3 valeurs entières entre 0 et 255 inclusaffichez l’image avec
plt.imshow
# votre code ici
comparaison des temps de création tableaux¶
(avancé)
# le code
%timeit 1 + 1
36.2 ns ± 11.7 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
# le code
%timeit -n 10000 1 + 1
9.91 ns ± 0.221 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%%timeit
a = 1
a + 1
59.3 ns ± 17.6 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
exercice
comparez les temps d’exécution de
la création d’un
numpy.ndarray
à partir d’une liste Python comportant 10.000 floats initialisés à 0
ne pas mettre la création de la liste Python dans le calcul du tempsla création d’un
numpy.ndarray
de 10.000 éléments initialisés à 0la création d’un
numpy.ndarray
de 10.000 éléments non-initialiséslequel est le plus rapide ?
# votre code ici