contenu de ce notebook (sauter si déjà acquis)¶
avoir une intuition de ce qui se passe dans en mémoire pour un numpy.ndarray
An array object represents a multidimensional, homogeneous array of fixed-size items.
- indiçage des tableaux
numpy
- modification de la taille des tableaux
numpy
avecnumpy.resize
etnumpy.reshape
(la mémoire sous-jacente est partagée) - indirection versus décalage (offset)
organisation de la mémoire¶
créons un tableau numpy
en 2 dimensions: 4 lignes et 5 colonnes
import numpy as np
mat = np.array(
[[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]])
mat
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]])
la mémoire occupée en mémoire en nombre d’octets (byte)
mat.nbytes
160
organisation en mémoire des tableaux¶
rapidité des manipulations mémoire¶
offset¶
pas d’indirection mémoire¶
exercice: tableau de chaînes de caractères¶
exercices
- à partir de la liste Python de chaînes de caractères
l = ['un', 'deux', 'trois', 'cinq']
créez un tableau numpy.ndarray
(de nom tab
) et affichez-le
- modifiez le premier élément pour mettre
quatre
tab[0] = 'quatre'
et affichez le tableau
Que constatez-vous ? Pourquoi
quatr
?affichez le type des éléments, le comprenez-vous ?
<
est une histoire d’ordre des octets dans les objetsU
signifie unicode
Que signifie5
?
# votre code ici
numpy
cherche le plus petit type pour stocker les chaînes de caractères initiales
ici une case est constituée d’un tableau d’au plus 5 caractères
(une case n’est pas l’adresse d’une chaîne de caractère mais bien la valeur de la chaîne)
exercice: tableau hétérogène¶
exercice
- créez un tableau
np.ndarray
à partir de la liste Python suivante
l = [127, 128, 17.4, np.pi, True, False]
affichez le type des éléments
que constatez-vous ?
quenumpy
a trouvé le plus petit type pouvant contenir tous ces objets numériquesajoutez à la liste Python
l
, la chaîne de caractèresbonjour
et créez un autrenumpy.ndarray
à partir de la nouvelle valeur del
affichez les éléments
Que constatez-vous ?quel type
numpy
a-t-il trouvé pour stocker tous ces éléments ?
# votre code ici
Pour plus d’informations, voir https://
index des tableaux¶
forme des tableaux numpy¶
1-dimension¶
2-dimension¶
3-dimension¶
les lignes et colonnes¶
# votre code ici
changer la forme d’un tableau¶
fonctions resize
et reshape
¶
on peut modifier la forme d’un numpy.ndarray
existant
tant qu’on ne modifie pas son nombre d’éléments
deux fonctions pour réindexer un tableau: ndarray.reshape
et ndarray.resize
np.ndarray.reshape
renvoie un tableau contenant les mêmes données avec une nouvelle formenp.ndarray.resize
modifie la forme du tableau en-place (directement dans le tableau)
et ne renvoie donc rien
NB: aucune des deux fonctions ne crée un nouveau segment de données
elle ne font que créer (reshape) ou modifier (resize) l’indexation
reshape
seg = np.arange(0, 30)
seg = seg.reshape(5, 6) # reshape retourne le tableau ainsi modifié
seg = seg.reshape(2, 5, 3)
on peut le faire dès la création du tableau
l = range(30)
seg = np.array(l).reshape(2, 5, 3)
resize
seg = np.arange(0, 30)
seg.resize(5, 6) # resize modifie le tabeau en place
seg.resize(2, 5, 3)
si aucune mémoire n’est créée, c’est que les différentes indexations prises sur un tableau
partagent l’objet sous-jacent
# le code
seg = np.arange(0, 30)
seg = seg.reshape(5, 6) # reshape retourne le tableau ainsi modifié
print(seg)
seg = seg.reshape(2, 5, 3)
print(seg)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]
[24 25 26 27 28 29]]
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]
[12 13 14]]
[[15 16 17]
[18 19 20]
[21 22 23]
[24 25 26]
[27 28 29]]]
# le code
seg = np.arange(0, 30)
seg.resize(5, 6) # resize modifie le tabeau en place
print(seg)
seg.resize(2, 5, 3)
print(seg)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]
[24 25 26 27 28 29]]
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]
[12 13 14]]
[[15 16 17]
[18 19 20]
[21 22 23]
[24 25 26]
[27 28 29]]]
mémoire partagée¶
exercice
créez un tableau
tab
de 6ones
de forme(6)
et affichez-lemettez dans
tab1
le reshape detab
avec la forme(3, 2)
et affichez-lemodifiez le premier élément de
tab
affichez
tab1
a-t-il été modifié ?
les deux objets tab
et tab1
de type numpy.ndarray
- sont des objets différents (leurs index sont différents)
- mais ils ont le même segment sous-jacent de données
- toucher l’un a pour effet de modifier l’autre
indice pour créer un tuple de dimension 1
si vous écrivez (1)
dans un programme Python, les parenthèses sont interprétées comme dans un calcul, i.e. comme dans (2+3)
, du coup le résultat c’est l’entier 1
du coup pour contruire un tuple qui ne contient que un élément, je vous recommande d’écrire (1,)
# votre code