HOWTO · NumPy

NumPy Shuffle Two Arrays

Hay tres métodos principales que se pueden usar para mezclar dos matrices correspondientes en Python, la función sklearn.utils.shuffle(), la función numpy.random.shuffle() y la función numpy.random.permutation().

En esta página

Barajar dos matrices relacionadas significa cambiar juntas el orden de sus filas. Si la fila i de una matriz describe la fila i de otra —por ejemplo, una fila de características y su etiqueta—, ambas matrices deben usar la misma permutación. Barajarlas por separado rompe esa relación. Los ejemplos siguientes usan una matriz de características con dos columnas y una matriz de etiquetas; los valores coincidentes de cada fila permiten ver la correspondencia.

Barajar dos matrices manteniendo alineadas las filas correspondientes

Aplica el mismo orden de filas a ambas matrices. La primera dimensión debe tener la misma longitud en cada entrada. Si las matrices tienen varias columnas, el orden compartido selecciona filas completas, por lo que los valores de cada fila permanecen juntos.

Ejecuta este ejemplo con un orden fijo para comprobar fácilmente la correspondencia entre la fila de características y la etiqueta:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

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]

El orden fijo sirve como ilustración; cuando quieras una disposición aleatoria, usa un orden generado con uno de los métodos para barajar que se muestran a continuación.

Usar sklearn.utils.shuffle()

sklearn.utils.shuffle() acepta varias matrices y aplica un orden coherente a todas; devuelve las matrices barajadas para que las asignes. Si tienes instalado scikit-learn, primero importa la función con from sklearn.utils import shuffle y luego llama a features_shuffled, labels_shuffled = shuffle(features, labels). Pasa todas las matrices relacionadas en la misma llamada para que las filas resultantes sigan emparejadas. Este método resulta práctico si scikit-learn ya forma parte del proyecto. El orden aleatorio puede variar entre llamadas, y la función devuelve resultados para asignarlos, en vez de reorganizar las matrices de origen en el propio sitio.

La importación y la llamada requieren scikit-learn, que no está disponible en todos los entornos de Python. Si lo tienes instalado, ejecuta la importación antes de la llamada y asigna ambas matrices devueltas. Esta llamada específica de la dependencia se muestra como sintaxis, no como un ejemplo ejecutado; las secciones de NumPy que aparecen a continuación ofrecen alternativas ejecutables sin scikit-learn.

Usar una permutación compartida con NumPy

numpy.random.permutation(features.shape[0]) crea una secuencia barajada de índices de filas. Guárdala en order y luego selecciona features[order] y labels[order]. La indexación avanzada de NumPy produce resultados indexados y deja las matrices de origen disponibles en su orden original. Conserva order para reutilizar exactamente esta disposición, aplicarla a más matrices o guardarla junto con los datos para un paso posterior. Generar y conservar el orden de los índices también evita depender de una interfaz específica de estado aleatorio.

Aquí, un único orden generado indexa ambas matrices. El orden de las filas impresas varía, pero los pares de características y etiquetas permanecen juntos:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

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)

Barajar una matriz compartida de índices con NumPy

numpy.random.shuffle() modifica la secuencia que recibe en el propio sitio. Crea una matriz de índices con order = np.arange(features.shape[0]), barájala con np.random.shuffle(order) y selecciona ambas matrices de origen con features[order] y labels[order]. Así, los datos de origen permanecen intactos y el orden de las filas queda explícito. El método también sirve para matrices adicionales: indexa cada matriz alineada con los mismos índices barajados. Solo order se baraja en el propio sitio; los resultados indexados son matrices independientes. Conserva una copia de order si otro código podría modificarla y necesitas mantener esta disposición.

Este ejemplo modifica únicamente order; ambas matrices de origen se indexan con esa misma secuencia barajada:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

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)

Comprobar las formas, la modificación y la reproducibilidad

Las matrices deben tener primeras dimensiones compatibles: sus longitudes a lo largo del eje 0 deben coincidir, aunque las dimensiones restantes pueden ser distintas. Por ejemplo, una matriz de filas de características puede emparejarse con una matriz unidimensional de etiquetas. Comprueba los tamaños de la dimensión inicial antes de aplicar un orden de índices para asegurarte de que cada índice sea válido para todas las matrices.

Los tres métodos difieren en lo que modifican. sklearn.utils.shuffle() devuelve matrices barajadas para asignarlas. numpy.random.permutation() devuelve un nuevo orden de índices, y usarlo para indexar matrices crea resultados reordenados. numpy.random.shuffle() modifica la matriz de índices que recibe; en estos ejemplos no baraja directamente las matrices de origen. En todos los casos, la correspondencia se conserva únicamente si todas las matrices relacionadas usan el mismo orden.

Para reproducir el resultado, conserva la matriz de índices generada y vuelve a aplicarla a las matrices originales, o guárdala junto con los datos. Al reutilizar el mismo orden de índices se obtiene de nuevo la misma disposición sin depender de una API de estado aleatorio no especificada. Si necesitas un nuevo barajado independiente, genera otro orden. Estos ejemplos no garantizan un orden impreso concreto.