[Python] Pourquoi ma boucle for à l'aide de la fonction range ne renvoie pas d'erreur?

Bonjour

Dans mon code qui fonctionne

def normalisation_min_max(X):
    X_tilde = np.zeros(shape = X.shape)
    for i in range(0,X.shape[1]):
        petit=min(X[:,i])
        grand=max(X[:,i])
        X_tilde[:,i]=(X[:,i]-petit)/(grand-petit)
    return X_tilde

X=np.array([[24,1.88],
           [18,1.68],
            [14,1.65]])
print(X.shape[1])
print(normalisation_min_max(X))

ça me retourne bien
2
[[1.         1.        ]
 [0.4        0.13043478]
 [0.         0.        ]]

Je ne comprends pas pourquoi ça fonctionne car dans la définition de la fonction, i balaye les valeurs de 0 à 2 (puisque X est de dimension 3-2, et que X.shape[1] me retourne la taille de la deuxième dimension de X qui est 2)

Les index commençant à 0, dans la première itération du for, ça modifie la première colonne du X_tilde.
Dans la 2e itération, ça modifie la 2e colonne du X_tilde
Puis dans la 3e itération (quand i prend la valeur 2), d’après moi ça devrait mettre une erreur du style out of range parce que petit=min(X[:,2]) ne devrait pas exister.
Et pourtant ça fonctionne donc je ne comprends pas. Merci de m’expliquer.

Pour moi la boucle for devrait être for i in range(0,X.shape[1]-1): afin de balayer de 0 à 1 les colonnes de la matrice X.

Bonjour Franck,

La fonction range est un peu trompeuse car en écrivant range(0,10), en réalité, nous avons tous les entiers entre 0 et 10 avec 0 inclus et 10 EXCLUS.

Donc dans votre code, comme X.shape[1] est égal à 2, range(0, X.shape[1]) est équivalent à range(0, 2), c’est à dire à tous les entiers entre 0 inclus et 2 EXCLUS, c’est à dire 0 et 1.

Vous n’obtenez donc pas d’erreur.

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

Parfaitement clair, merci