Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

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

accès aux éléments d’un tableau


accès à un tableau de dimension 1

(dtype('int64'), np.int64(3))
(dtype('float64'), np.float64(3.141592653589793))

accès à un tableau de dimension > à 1

array([[ 0, 1000, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11]])
array([[[ 0, 1000], [ 2, 3], [ 4, 5]], [[ 6, 7], [ 8, 9], [2000, 11]]])
[2, 3, 2]
(2, 3, 2)

exercices

accès à un élément

  1. créez un tableau des 30 valeurs paires à partir de 2 (utilisez numpy pas Python)

  2. donnez lui la forme de 2 matrices de 5 lignes et 3 colonnes

  3. accédez à l’élément qui est à la 3ème colonne de la 2ème ligne de la 1ère matrice

  4. obtenez-vous 12 ?

exercice

  1. faites un np.ndarray de forme (3, 2, 5, 4)
    avec des nombre aéatoires entiers entre 0 et 100

  2. affichez-le et vous voyez trois groupes et 2 matrices de 5 lignes et 4 colonnes

  3. affichez le nombre des éléments des deux dernières dimensions

accéder à un sous-tableau (slicing)

différence slicing python et numpy


rappel du slicing Python

[0, 2, 4, 6, 8]
[1, 4, 7]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

slicing en dimension 1

[0 2 4 6 8]
array([100, 1, 100, 3, 100, 5, 100, 7, 100, 9])

slicing en dimension > à 1 (a)

[[[[  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]
   [ 30  31  32  33  34]
   [ 35  36  37  38  39]]

  [[ 40  41  42  43  44]
   [ 45  46  47  48  49]
   [ 50  51  52  53  54]
   [ 55  56  57  58  59]]]


 [[[ 60  61  62  63  64]
   [ 65  66  67  68  69]
   [ 70  71  72  73  74]
   [ 75  76  77  78  79]]

  [[ 80  81  82  83  84]
   [ 85  86  87  88  89]
   [ 90  91  92  93  94]
   [ 95  96  97  98  99]]

  [[100 101 102 103 104]
   [105 106 107 108 109]
   [110 111 112 113 114]
   [115 116 117 118 119]]]]
[[[ 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]
  [30 31 32 33 34]
  [35 36 37 38 39]]

 [[40 41 42 43 44]
  [45 46 47 48 49]
  [50 51 52 53 54]
  [55 56 57 58 59]]]
[[20 21 22 23 24]
 [25 26 27 28 29]
 [30 31 32 33 34]
 [35 36 37 38 39]]
[30 31 32 33 34]
[23 28 33 38]

slicing en dimension > à 1 (b)

array([[[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]], [[60, 61, 62, 63, 64], [65, 66, 67, 68, 69], [70, 71, 72, 73, 74], [75, 76, 77, 78, 79]]])
array([[[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]], [[60, 61, 62, 63, 64], [65, 66, 67, 68, 69], [70, 71, 72, 73, 74], [75, 76, 77, 78, 79]]])

exercices

  1. extrayez du tableau tab précédent

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

la sous-matrice au milieu des premières matrices de tous les groupes, ici ça doit donner:

[[678111213],[666768717273]]\begin{bmatrix}\begin{bmatrix} 6 & 7 & 8\\ 11 & 12 & 13 \end{bmatrix}, \begin{bmatrix} 66 & 67 & 68 \\ 71 & 72 & 73 \end{bmatrix}\end{bmatrix}

indices
on a 2 groupes de 3 matrices de 4 lignes et 5 colonnes

donc

donc

les sous-tableaux sont des vues, et non des copies


partage du segment sous-jacent ou non? - avancé

None
None
True
True
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

exercice

  1. créez un nouveau tableau formé des deux matrices [(24681012),(141618202224)][\begin{pmatrix} 2 & 4 & 6\\ 8 & 10 & 12 \end{pmatrix}, \begin{pmatrix} 14 & 16 & 18 \\ 20 & 22 & 24 \end{pmatrix}].

  2. affichez sa base

  3. slicez le tableau pour obtenir [(242220181614),(12108642)][\begin{pmatrix} 24 & 22 & 20 \\ 18 & 16 & 14 \\ \end{pmatrix}, \begin{pmatrix} 12 & 10 & 8 \\ 6 & 4 & 2\end{pmatrix}]

  4. affichez la base de la slice

  5. vérifiez que les deux base sont le même objet

modification des sous-tableaux

exercices avancés pour les rapides

avant d’aborder ces exercices, il existe un utilitaire très pratique (parmi les 2347 que nous n’avons pas eu le temps de couvrir ;); il s’agit de numpy.indices()

commençons par un exemple :

array([[0, 0, 0, 0, 0], [1, 1, 1, 1, 1], [2, 2, 2, 2, 2]])
array([[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]])

vous remarquerez que dans le tableau qui s’appelle lignes, la valeur dans le tableau correspond au numéro de ligne; dit autrement :

et dans l’autre sens bien sûr

np.int64(1)
np.int64(4)

Pourquoi est-ce qu’on parle de ça me direz-vous ?

Eh bien en guise d’indice, cela vous renvoie à la notion de programmation vectorielle.

Ainsi par exemple si je veux créer une matrice de taille (3,5) dans laquelle M[i, j] == i + j, je ne vais surtout par écrire une boucle for, et au contraire je vais écrire simplement

array([[0, 1, 2, 3, 4], [1, 2, 3, 4, 5], [2, 3, 4, 5, 6]])

les rayures

Écrivez une fonction stripes, qui prend en argument un entier n et qui fabrique un tableau carré de coté n, formé d’une alternance de colonnes de 0 et de colonnes de 1.

par exemple pour n=4 on s’attend à ceci

0 1 0 1
0 1 0 1
0 1 0 1
0 1 0 1

le damier

Écrivez une fonction checkers, qui prend en argument la taille n du damier, et un paramètre optionnel qui indique la valeur de la case (0, 0), et qui crée un tableau numpy carré de coté n, et le remplit avec des 0 et 1 comme un damier.

vous devez obtenir par exemple

>>> checkers(4)

array([[1, 0, 1, 0],
       [0, 1, 0, 1],
       [1, 0, 1, 0],
       [0, 1, 0, 1]])

>>> checkers(5, False)

array([[0, 1, 0, 1, 0],
       [1, 0, 1, 0, 1],
       [0, 1, 0, 1, 0],
       [1, 0, 1, 0, 1],
       [0, 1, 0, 1, 0]])

le super damier par blocs

Il y a beaucoup de méthodes pour faire cet exercice de damier; elles ne vont pas toutes se généraliser pour cette variante du super damier :

Variante écrivez une fonction block_checkers(n, k) qui crée et retourne

c’est-à-dire par exemple pour n=4 et k=3 cela donnerait ceci :

>>> block_checkers(4, 3)

array([[0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1],
       [1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
       [1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
       [1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1],
       [1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
       [1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
       [1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0]])

la pyramide

Écrivez une fonction pyramid, qui prend en argument un entier n, qui crée un tableau de taille 2n+1, et qui le remplit de manière à ce que:

par exemple

>>> pyramid(4)

array([[0, 1, 2, 3, 4, 3, 2, 1, 0],
       [1, 2, 3, 4, 5, 4, 3, 2, 1],
       [2, 3, 4, 5, 6, 5, 4, 3, 2],
       [3, 4, 5, 6, 7, 6, 5, 4, 3],
       [4, 5, 6, 7, 8, 7, 6, 5, 4],
       [3, 4, 5, 6, 7, 6, 5, 4, 3],
       [2, 3, 4, 5, 6, 5, 4, 3, 2],
       [1, 2, 3, 4, 5, 4, 3, 2, 1],
       [0, 1, 2, 3, 4, 3, 2, 1, 0]])

calculs imbriqués (avancé)

Regardez le code suivant :

Les questions : j’ai un tableau X typé float64 et de forme (1000,)

indice