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
numpymodification de la forme des tableaux
numpyavecnumpy.resizeetnumpy.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 npmat = np.array(
[[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]])
matarray([[ 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.nbytes160organisation 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 objetsUsignifie unicode
Que signifie5?
# votre code icinumpy 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 ?
quenumpya 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 delaffichez les éléments
Que constatez-vous ?quel type
numpya-t-il trouvé pour stocker tous ces éléments ?
# votre code iciPour plus d’informations, voir https://
index des tableaux¶
forme des tableaux numpy¶
1-dimension¶
2-dimension¶
3-dimension¶
les lignes et colonnes¶
# votre code icichanger 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
tabde 6onesde forme(6)
et affichez-lemettez dans
tab1le reshape detabavec la forme(3, 2)
et affichez-lemodifiez le premier élément de
tabaffichez
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