HOWTO · NumPy
NumPy Shuffle zwei Arrays
Es gibt drei Hauptmethoden, mit denen zwei entsprechende Arrays in Python gemischt werden können, die Funktion sklearn.utils.shuffle(), die Funktion numpy.random.shuffle() und die Funktion numpy.random.permutation().
Auf dieser Seite
Beim gemeinsamen Mischen zweier zusammengehöriger Arrays wird ihre Zeilenreihenfolge gleichzeitig geändert. Beschreibt Zeile i in einem Array die Zeile i im anderen – etwa eine Merkmalszeile und das dazugehörige Label –, müssen beide Arrays dieselbe Permutation verwenden. Werden sie unabhängig voneinander gemischt, geht diese Zuordnung verloren. Die Beispiele verwenden ein zweispaltiges Merkmalsarray und ein Label-Array; gleiche Werte in den Zeilen machen die Zuordnung sichtbar.
Zwei Arrays mischen und zugehörige Zeilen zusammenhalten
Wende auf beide Arrays dieselbe Zeilenreihenfolge an. Die erste Dimension muss bei beiden Eingaben gleich lang sein. Bei Arrays mit mehreren Spalten wählt die gemeinsame Reihenfolge ganze Zeilen aus, sodass die Werte innerhalb einer Zeile zusammenbleiben.
Führe dieses Beispiel mit einer festgelegten Reihenfolge aus, damit sich die Zuordnung zwischen Merkmalszeile und Label leicht prüfen lässt:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
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]
Die feste Reihenfolge dient nur der Veranschaulichung. Verwende eine der unten gezeigten Mischmethoden, wenn du eine zufällige Anordnung möchtest.
sklearn.utils.shuffle() verwenden
sklearn.utils.shuffle() nimmt mehrere Arrays entgegen und wendet auf alle dieselbe Reihenfolge an. Die gemischten Arrays werden zurückgegeben und können Variablen zugewiesen werden. Wenn scikit-learn installiert ist, importiere die Funktion zunächst mit from sklearn.utils import shuffle und rufe sie anschließend mit features_shuffled, labels_shuffled = shuffle(features, labels) auf. Übergib alle zusammengehörigen Arrays im selben Aufruf; so bleiben die Zeilen einander zugeordnet. Diese Methode ist praktisch, wenn scikit-learn bereits zum Projekt gehört. Die zufällige Reihenfolge kann sich von Aufruf zu Aufruf ändern. Die Funktion gibt Ergebnisse zur Zuweisung zurück, statt die Quellarrays direkt an Ort und Stelle umzuordnen.
Für den Import und den Aufruf muss scikit-learn installiert sein; das ist nicht in jeder Python-Umgebung der Fall. Führe bei vorhandener Installation zuerst den Import aus und weise anschließend beide zurückgegebenen Arrays Variablen zu. Dieser Aufruf mit seiner spezifischen Abhängigkeit ist als Syntaxbeispiel und nicht als ausgeführtes Beispiel dargestellt. Die folgenden Abschnitte mit NumPy zeigen ausführbare Alternativen ohne scikit-learn.
Eine gemeinsame Permutation mit NumPy verwenden
numpy.random.permutation(features.shape[0]) erzeugt eine gemischte Folge von Zeilenindizes. Speichere sie in order und wähle dann mit features[order] und labels[order] die Zeilen aus. Die erweiterte Indizierung von NumPy erzeugt indizierte Ergebnisse; die Quellarrays bleiben in ihrer ursprünglichen Reihenfolge erhalten. Bewahre order auf, um genau diese Anordnung erneut zu verwenden, auf weitere Arrays anzuwenden oder zusammen mit den Daten für einen späteren Schritt zu speichern. Wenn du die Indexreihenfolge erzeugst und aufbewahrst, bist du außerdem nicht auf eine bestimmte Schnittstelle für den Zufallszustand angewiesen.
Hier indiziert eine einzige erzeugte Reihenfolge beide Arrays. Die ausgegebene Zeilenreihenfolge variiert, die Paare aus Merkmalen und Labels bleiben jedoch zusammen:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
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)
Ein gemeinsames Indexarray mit NumPy mischen
numpy.random.shuffle() verändert die übergebene Sequenz direkt. Erzeuge mit order = np.arange(features.shape[0]) ein Indexarray, mische dieses Array mit np.random.shuffle(order) und wähle anschließend aus beiden Quellarrays mit features[order] und labels[order] aus. Die Quelldaten bleiben dabei unverändert und die Zeilenreihenfolge wird ausdrücklich festgehalten. Das funktioniert auch mit weiteren Arrays: Indiziere jedes ausgerichtete Array mit denselben gemischten Indizes. Nur order wird direkt verändert; die indizierten Ergebnisse sind separate Arrays. Bewahre eine Kopie von order auf, wenn anderer Code die Reihenfolge später ändern könnte und du sie weiterhin benötigst.
Dieses Beispiel verändert nur order; beide Quellarrays werden mit derselben gemischten Folge indiziert:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
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)
Formen, Mutationen und Reproduzierbarkeit prüfen
Die Arrays müssen kompatible erste Dimensionen haben: Ihre Längen entlang der Achse 0 müssen übereinstimmen, während sich die übrigen Dimensionen unterscheiden dürfen. Beispielsweise kann ein Array mit Merkmalszeilen eine Matrix sein und das Label-Array eindimensional. Prüfe die führenden Dimensionen, bevor du eine Indexreihenfolge anwendest, damit jeder Index für jedes Array gültig ist.
Die drei Ansätze unterscheiden sich darin, was sie verändern. sklearn.utils.shuffle() gibt gemischte Arrays zurück, die du Variablen zuweisen kannst. numpy.random.permutation() gibt eine neue Indexreihenfolge zurück; die Verwendung dieser Reihenfolge zur Indizierung erzeugt umgeordnete Ergebnisse. numpy.random.shuffle() verändert das übergebene Indexarray, mischt in diesen Beispielen aber nicht direkt die Quellarrays. Die Zuordnung bleibt nur erhalten, wenn alle zusammengehörigen Arrays dieselbe Reihenfolge verwenden.
Für reproduzierbare Ergebnisse kannst du das erzeugte Indexarray aufbewahren und erneut auf die ursprünglichen Arrays anwenden oder es zusammen mit den Daten speichern. Mit derselben Indexreihenfolge entsteht erneut dieselbe Anordnung, ohne dass eine nicht näher angegebene Schnittstelle für den Zufallszustand vorausgesetzt wird. Wenn du eine neue, unabhängige Mischung brauchst, erzeuge eine neue Reihenfolge. Die Beispiele garantieren keine bestimmte ausgegebene Reihenfolge.