Exercice 55 / 100

NumPy — Reshape & Slicing

ConsigneRedimensionne et découpe des arrays avec reshape et slicing

📖 Cours

Les arrays NumPy peuvent être redimensionnés (reshape) ou découpés (slicing). Le plus souvent ces opérations ne copient rien : elles renvoient une vue sur les mêmes données, ce qui est très efficace. reshape doit tout de même recopier quand l'ordre des éléments en mémoire l'exige, par exemple après une transposée. np.shares_memory(a, b) dit si deux arrays partagent la même mémoire.

reshape : changer la forme

a = np.arange(12) # shape (12,)b = a.reshape(3, 4) # shape (3, 4) → 3 lignes × 4 colonnesc = a.reshape(2, 2, 3) # shape (2, 2, 3) → 3Dd = a.reshape(-1, 4) # -1 = "calcule toi-même" → (3, 4)

Le produit des dimensions doit être égal au nombre total d'éléments.

reshape(3, 5) sur un array de 12 éléments → erreur.

Sur cet array, reshape ne touche qu'à la forme : les douze éléments et le bloc en mémoire restent les mêmes, on obtient une vue et non une copie, exactement comme avec une tranche
Sur cet array, reshape ne touche qu'à la forme : les douze éléments et le bloc en mémoire restent les mêmes, on obtient une vue et non une copie, exactement comme avec une tranche
a.flatten() → retransforme en 1D (renvoie une COPIE)a.ravel() → retransforme en 1D (renvoie une VUE si possible, plus efficace)

Slicing 1D : comme une liste Python

a = np.array([10, 20, 30, 40, 50])a[1:4] → [20 30 40]a[::2] → [10 30 50]a[::-1] → inversé

Slicing 2D : ligne, colonne

Syntaxe : a[lignes, colonnes]

b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12]])
b[0] → [1 2 3 4] (ligne 0)b[0, :] → [1 2 3 4] (équivalent)b[:, 1] → [2 6 10] (colonne 1)b[0:2, 1:3] → [[2 3] [6 7]] (sous-matrice)b[-1, -1] → 12 (dernier élément)

Transposée

b.T → échange lignes et colonnesnp.transpose(b) → équivalent

⚠ Slicing = VUE, pas copie

Les slices NumPy partagent la mémoire de l'array d'origine. Modifier la slice modifie l'original :

s = a[1:4]s[0] = 999# a est modifié aussi !

Pour une vraie copie : a[1:4].copy()

reshape + ravel sont les couteaux suisses des transformations d'arrays. Très utilisés en deep learning pour passer d'images (2D/3D) à des vecteurs (1D).

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →