HOWTO · NumPy
Função numpy.random.permutation() em NumPy
A função numpy.random.permutation() retorna uma cópia permutada aleatoriamente de um array, ou um intervalo permutado de inteiros quando lhe é passado um inteiro, e deixa os dados originais inalterados — ao contrário de numpy.random.shuffle(), que embaralha o array no lugar.
Nesta página
numpy.random.permutation() permuta aleatoriamente uma sequência, ou retorna um intervalo permutado. Passe-lhe um array e ele retorna uma cópia embaralhada desse array — o original fica exatamente como estava. Passe-lhe um inteiro n e ele retorna os inteiros de 0 a n - 1 numa ordem aleatória. Esse comportamento de copiar em vez de modificar é toda a diferença em relação a numpy.random.shuffle(), que embaralha um array no lugar.
Permutar um array sem alterar o original
Com um array, permutation() constrói um novo array com os mesmos elementos numa ordem aleatória:
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)
Saída:
Original Array: [1 2 3 4 5]
Shuffled Array: [3 1 5 2 4]
A ordem em shuffled_array é aleatória, pelo que a saída acima é um resultado possível, e não o que cada execução produz. O que não varia é original_array: continua a conter [1 2 3 4 5], que é o que faz de permutation() a escolha certa quando a ordem original ainda importa mais tarde — por exemplo, quando um conjunto de dados tem de permanecer alinhado com as suas etiquetas.
Com um inteiro, permutation() retorna um intervalo permutado, o que é uma forma conveniente de obter índices aleatórios:
import numpy as np
n = 5
permuted_indices = np.random.permutation(n)
print("Permuted Indices:", permuted_indices)
Saída:
Permuted Indices: [4 0 2 3 1]
Mais uma vez, a ordem exata difere de execução para execução. Passar um inteiro equivale a construir primeiro o intervalo com np.arange(n) e permutar esse array.
Comparar permutation() e shuffle()
As duas funções diferem no que retornam e no que fazem aos seus dados. permutation() retorna um novo array e nunca toca na sua entrada. numpy.random.shuffle() não retorna nada e reordena o próprio array, no 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)
Saída:
Shuffled Original Array: [2 5 1 4 3]
Após esta chamada, a ordem original desapareceu. Escolha shuffle() quando não precisa dela e quer reordenar no lugar; escolha permutation() quando o original tem de sobreviver. Uma consequência prática da cópia: num conjunto de dados grande, permutation() precisa de memória para o segundo array, pelo que deve pesar essa conveniência contra a memória adicional quando os dados são grandes.