Quand et comment sont initialisées les dimensions d'un array numpy?

Dans le code suivant - array numpy :

# Création d'un array de dimensions 32x32x3   (lignes x colonnes x canaux)
X = np.zeros(shape = (32, 32, 3))

# Itération sur la première dimension de l'array (les lignes)
for ligne in X:
    # Itération sur la deuxième dimension de l'array (les pixels de la ligne)
    for pixel in ligne:
        # Itération sur la troisième dimension de l'array (les canaux du pixel)
        for canal in pixel:
            ...

est ce que les dimensions ont été initialisées automatiquement ?
Ne faut il pas initialiser chaque dimension par le code :
ligne, pixel, canal = X.shape

Bonjour Philippe,

Les dimensions sont initialisées au moment de la déclaration de X. En effet, l’argument shape = (32, 32, 3) de np.zeros indique que nous souhaitons un array en 3 dimensions avec 32 lignes de 32 pixels et chacun de ces pixels est représenté par 3 éléments (pour la couleur RVB).

Par la suite, nous souhaitons parcourir notre array X.

Pour que ce soit plus parlant, je vais prendre un exemple avec Y = np.zeros(shape = (2, 2, 3)).
Comme la première dimension de Y est 2, il faut considérer Y comme une liste de 2 objets, Y ressemble à ça : [*, *].
Donc pour parcourir Y, il faut d’abord accéder à ses éléments les moins profonds, c’est à dire aux deux éléments de la première dimension (représentés par une *).

Donc le code for ligne in Y: créera une boucle à 2 itérations où ligne prendra la valeur du premier élément * puis du 2e.

Nous avons à présent accès aux éléments * par la variable ligne. Or, comme la 2e dimension de Y est 2, cela signifie que ligne est une liste de 2 objets, ligne ressemble à ça : [#, #].
Donc le code for pixel in ligne: créera une boucle à 2 itérations où pixel prendra la valeur du premier élément # puis du 2e.

Nous avons enfin accès aux élément # par la variable pixel. Or, comme la 3e dimension de Y est 3 et que Y ne contient que des 0, cela signifie que pixel est une liste de 3 objets, pixel ressemble à ça : [0, 0, 0].

Donc le code for canal in pixel: créera une boucle à 3 itérations où canal prendra la valeur 0, puis la valeur 0 et enfin la valeur 0.

Cet exemple avec Y représente tout à fait ce qu’il se passe avec X de dimension (32, 32, 3).

J’espère avoir répondu à votre question.
Bonne journée
Antoine

1 Like

ok, merci. Bonne explication.
les 2 éléments, par exemple i et ligne, sont initialisés au moment des itérations de boucle ?

Je ne comprends pas de quel élément i vous parlez ?

je suis allé n peu vite : ma question porte sur un autre exemple d’array où deux éléments i ligne sont itérés sur un enumerate de X

Avec enumerate(X), vous parcourez votre array X avec 2 variables (i et ligne par exemple). i correspondra à l’indice de l’élément et ligne correspondra à sa valeur.
Ces deux éléments sont en effet initialisés au moment de la première itération de boucle.

parfait, merci pour la confirmation.