Qual é a maneira mais fácil de embaralhar uma matriz com python?
new_array = random.sample( array, len(array) )
.
Qual é a maneira mais fácil de embaralhar uma matriz com python?
new_array = random.sample( array, len(array) )
.
Respostas:
import random
random.shuffle(array)
import random
random.shuffle(array)
Maneira alternativa de fazer isso usando o sklearn
from sklearn.utils import shuffle
X=[1,2,3]
y = ['one', 'two', 'three']
X, y = shuffle(X, y, random_state=0)
print(X)
print(y)
Resultado:
[2, 1, 3]
['two', 'one', 'three']
Vantagem: você pode aleatoriamente várias matrizes simultaneamente sem interromper o mapeamento. E 'random_state' pode controlar a reprodução aleatória de comportamentos reproduzíveis.
As outras respostas são as mais fáceis, no entanto, é um pouco chato que o random.shuffle
método não retorne nada - apenas classifica a lista fornecida. Se você deseja encadear chamadas ou apenas poder declarar uma matriz embaralhada em uma linha, você pode:
import random
def my_shuffle(array):
random.shuffle(array)
return array
Então você pode fazer linhas como:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
Ao lidar com listas regulares de Python, random.shuffle()
fará o trabalho exatamente como as respostas anteriores mostram.
Mas quando se trata de ndarray
( numpy.array
), random.shuffle
parece quebrar o original ndarray
. Aqui está um exemplo:
import random
import numpy as np
import numpy.random
a = np.array([1,2,3,4,5,6])
a.shape = (3,2)
print a
random.shuffle(a) # a will definitely be destroyed
print a
Apenas use: np.random.shuffle(a)
Como random.shuffle
, np.random.shuffle
embaralha a matriz no local.
Caso queira uma nova matriz, você pode usar sample
:
import random
new_array = random.sample( array, len(array) )
Você pode classificar sua matriz com chave aleatória
sorted(array, key = lambda x: random.random())
a chave seja lida apenas uma vez, para comparar o item durante a classificação ainda eficiente.
mas parece que random.shuffle(array)
será mais rápido, uma vez que está escrito em C
array
que eu quis dizer o Random
elemento: ou seja, no lambda
o random.random()
novo pode estar gerando Random
instância de classe de cada vez. Na verdade, não tenho certeza: java
seria a maneira errada de fazer isso: você deve criar um Random rng = Random()
e depois chamar o rng.nextGaussian()
. Mas não sabe como python random.random()
funciona
Eu não sei o que usei, random.shuffle()
mas ele retornou 'Nenhum' para mim, então escrevi isso, pode ser útil para alguém
def shuffle(arr):
for n in range(len(arr) - 1):
rnd = random.randint(0, (len(arr) - 1))
val1 = arr[rnd]
val2 = arr[rnd - 1]
arr[rnd - 1] = val1
arr[rnd] = val2
return arr
Esteja ciente de que random.shuffle()
não deve ser usado em matrizes multidimensionais, pois causa repetições.
Imagine que você deseja embaralhar uma matriz ao longo de sua primeira dimensão, podemos criar o seguinte exemplo de teste,
import numpy as np
x = np.zeros((10, 2, 3))
for i in range(10):
x[i, ...] = i*np.ones((2,3))
de modo que, ao longo do primeiro eixo, o i-ésimo elemento corresponda a uma matriz 2x3 em que todos os elementos são iguais a i.
Se usarmos a função aleatória correta para matrizes multidimensionais, ou seja np.random.shuffle(x)
, a matriz será embaralhada ao longo do primeiro eixo, conforme desejado. No entanto, o uso random.shuffle(x)
causará repetições. Você pode verificar isso executando o len(np.unique(x))
shuffling, o que fornece 10 (conforme o esperado), np.random.shuffle()
mas apenas cerca de 5 ao usar random.shuffle()
.