HOWTO · NumPy

NumPy Shuffle deux tableaux

Il existe trois méthodes principales qui peuvent être utilisées pour mélanger deux tableaux correspondants en Python, la fonction sklearn.utils.shuffle(), la fonction numpy.random.shuffle() et la fonction numpy.random.permutation().

Sur cette page

Mélanger deux tableaux liés consiste à modifier leur ordre de lignes de la même façon. Si la ligne i d’un tableau décrit la ligne i d’un autre — par exemple, une ligne de caractéristiques et son étiquette — les deux tableaux doivent utiliser la même permutation. Les mélanger indépendamment rompt cette correspondance. Les exemples ci-dessous utilisent un tableau de caractéristiques à deux colonnes et un tableau d’étiquettes ; les valeurs correspondantes de chaque ligne rendent l’alignement visible.

Mélanger deux tableaux en gardant les lignes correspondantes alignées

Appliquez le même ordre de lignes aux deux tableaux. La première dimension doit avoir la même longueur pour chaque entrée. Pour les tableaux à plusieurs colonnes, l’ordre commun sélectionne des lignes entières : les valeurs d’une même ligne restent donc ensemble.

Exécutez cet exemple avec un ordre fixe pour vérifier facilement la correspondance entre chaque ligne de caractéristiques et son étiquette :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

import numpy as np

features = np.array([[10, 100], [20, 200], [30, 300]])
labels = np.array([1, 2, 3])
order = np.array([2, 0, 1])

print(features[order])
print(labels[order])
[[ 30 300]
 [ 10 100]
 [ 20 200]]
[3 1 2]

L’ordre fixe sert uniquement à illustrer le principe ; pour obtenir un ordre aléatoire, utilisez un ordre généré par l’une des méthodes de mélange ci-dessous.

Utiliser sklearn.utils.shuffle()

sklearn.utils.shuffle() accepte plusieurs tableaux et leur applique un ordre cohérent, puis renvoie les tableaux mélangés afin que vous puissiez les affecter à des variables. Après avoir installé scikit-learn, importez d’abord la fonction avec from sklearn.utils import shuffle, puis appelez features_shuffled, labels_shuffled = shuffle(features, labels). Passez tous les tableaux liés dans le même appel : les lignes correspondantes resteront associées. Cette méthode est pratique si scikit-learn fait déjà partie du projet. L’ordre aléatoire peut varier d’un appel à l’autre, et l’utilitaire renvoie des résultats à affecter ; il ne réorganise pas les tableaux sources sur place.

L’importation et l’appel nécessitent scikit-learn, qui n’est pas disponible dans tous les environnements Python. Une fois la bibliothèque installée, exécutez l’importation avant l’appel et affectez les deux tableaux renvoyés. Cet appel dépendant d’une bibliothèque est présenté comme une syntaxe, et non comme un exemple exécuté ; les sections NumPy ci-dessous proposent des solutions exécutables sans scikit-learn.

Utiliser une permutation commune avec NumPy

numpy.random.permutation(features.shape[0]) crée une séquence mélangée d’indices de lignes. Enregistrez-la dans order, puis sélectionnez features[order] et labels[order]. L’indexation avancée de NumPy produit des résultats indexés et laisse les tableaux sources dans leur ordre initial. Conservez order pour réutiliser exactement cette disposition, l’appliquer à d’autres tableaux ou l’enregistrer avec les données pour une étape ultérieure. Générer et conserver l’ordre des indices évite aussi de dépendre d’une interface particulière d’état aléatoire.

Ici, un seul ordre généré sert à indexer les deux tableaux. L’ordre de lignes affiché varie, mais les paires caractéristiques-étiquette restent associées :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

import numpy as np

features = np.array([[10, 100], [20, 200], [30, 300]])
labels = np.array([1, 2, 3])
order = np.random.permutation(features.shape[0])

features_shuffled = features[order]
labels_shuffled = labels[order]
print(features_shuffled)
print(labels_shuffled)

Mélanger un tableau d’indices commun avec NumPy

numpy.random.shuffle() modifie sur place la séquence qu’elle reçoit. Créez un tableau d’indices avec order = np.arange(features.shape[0]), mélangez-le avec np.random.shuffle(order), puis sélectionnez les deux tableaux sources avec features[order] et labels[order]. Les données sources restent ainsi intactes et l’ordre des lignes est explicite. Cette méthode convient aussi à d’autres tableaux : indexez chaque tableau aligné avec les mêmes indices mélangés. Seul order est modifié sur place ; les résultats indexés sont des tableaux distincts. Conservez une copie de order si un autre code risque de le modifier et que vous devez préserver cette disposition.

Cet exemple ne modifie que order ; les deux tableaux sources sont indexés avec cette même séquence mélangée :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

import numpy as np

features = np.array([[10, 100], [20, 200], [30, 300]])
labels = np.array([1, 2, 3])
order = np.arange(features.shape[0])
np.random.shuffle(order)

features_shuffled = features[order]
labels_shuffled = labels[order]
print(features_shuffled)
print(labels_shuffled)

Vérifier les formes, les mutations et la reproductibilité

Les tableaux doivent avoir des premières dimensions compatibles : leur longueur sur l’axe 0 doit être identique, même si leurs autres dimensions diffèrent. Par exemple, une matrice de lignes de caractéristiques peut être associée à un tableau d’étiquettes unidimensionnel. Vérifiez les tailles de tête avant d’appliquer un ordre d’indices afin que chaque indice soit valide pour tous les tableaux.

Les trois méthodes diffèrent par les éléments qu’elles modifient. sklearn.utils.shuffle() renvoie des tableaux mélangés à affecter à des variables. numpy.random.permutation() renvoie un nouvel ordre d’indices ; l’utiliser pour indexer des tableaux crée des résultats réordonnés. numpy.random.shuffle() modifie le tableau d’indices qu’elle reçoit ; dans ces exemples, elle ne mélange pas directement les tableaux sources. Dans chaque cas, la correspondance est préservée uniquement si tous les tableaux liés utilisent le même ordre.

Pour obtenir un résultat reproductible, conservez le tableau d’indices généré et appliquez-le de nouveau aux tableaux d’origine, ou enregistrez-le avec les données. Réutiliser le même ordre d’indices recrée la même disposition sans dépendre d’une API d’état aléatoire non spécifiée. Pour effectuer un nouveau mélange indépendant, générez un nouvel ordre. Ces exemples ne garantissent aucun ordre d’affichage particulier.