HOWTO · NumPy

Función numpy.random.permutation() en NumPy

La función numpy.random.permutation() devuelve una copia permutada aleatoriamente de un array, o un rango permutado de enteros cuando se le pasa un entero, y deja los datos originales sin cambios — a diferencia de numpy.random.shuffle(), que baraja el array en su lugar.

En esta página

numpy.random.permutation() permuta aleatoriamente una secuencia, o devuelve un rango permutado. Pásele un array y devuelve una copia barajada de ese array — el original queda exactamente como estaba. Pásele un entero n y devuelve los enteros de 0 a n - 1 en un orden aleatorio. Ese comportamiento de copiar en lugar de modificar es toda la diferencia con numpy.random.shuffle(), que baraja un array en su lugar.

Permutar un array sin cambiar el original

Con un array, permutation() construye un nuevo array que contiene los mismos elementos en un orden aleatorio:

import numpy as np

original_array = np.array([1, 2, 3, 4, 5])
shuffled_array = np.random.permutation(original_array)

print("Original Array:", original_array)
print("Shuffled Array:", shuffled_array)

Salida:

Original Array: [1 2 3 4 5]
Shuffled Array: [3 1 5 2 4]

El orden en shuffled_array es aleatorio, por lo que la salida anterior es un resultado posible, no lo que produce cada ejecución. Lo que no varía es original_array: sigue conteniendo [1 2 3 4 5], que es lo que hace de permutation() la elección correcta cuando el orden original sigue importando después — por ejemplo, cuando un conjunto de datos debe permanecer alineado con sus etiquetas.

Con un entero, permutation() devuelve un rango permutado, lo que es una forma cómoda de obtener índices aleatorios:

import numpy as np

n = 5
permuted_indices = np.random.permutation(n)

print("Permuted Indices:", permuted_indices)

Salida:

Permuted Indices: [4 0 2 3 1]

De nuevo, el orden exacto difiere de una ejecución a otra. Pasar un entero equivale a construir primero el rango con np.arange(n) y permutar ese array.

Comparar permutation() y shuffle()

Las dos funciones difieren en lo que devuelven y en lo que hacen con sus datos. permutation() devuelve un nuevo array y nunca toca su entrada. numpy.random.shuffle() no devuelve nada y reordena el propio array, en su lugar:

import numpy as np

original_array = np.array([1, 2, 3, 4, 5])
np.random.shuffle(original_array)

print("Shuffled Original Array:", original_array)

Salida:

Shuffled Original Array: [2 5 1 4 3]

Después de esta llamada, el orden original se ha perdido. Elija shuffle() cuando no lo necesite y quiera reordenar en su lugar; elija permutation() cuando el original deba sobrevivir. Una consecuencia práctica de la copia: en un conjunto de datos grande, permutation() necesita memoria para el segundo array, así que sopese esa comodidad frente a la memoria adicional cuando los datos sean grandes.