¿Cuál es la forma más fácil de barajar una matriz con python?
new_array = random.sample( array, len(array) )
.
¿Cuál es la forma más fácil de barajar una matriz con python?
new_array = random.sample( array, len(array) )
.
Respuestas:
import random
random.shuffle(array)
import random
random.shuffle(array)
Una forma alternativa de hacer esto usando 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)
Salida:
[2, 1, 3]
['two', 'one', 'three']
Ventaja: puede aleatorizar múltiples matrices simultáneamente sin interrumpir el mapeo. Y 'random_state' puede controlar la combinación para un comportamiento reproducible.
Las otras respuestas son las más fáciles, sin embargo, es un poco molesto que el random.shuffle
método en realidad no devuelva nada, simplemente clasifica la lista dada. Si desea encadenar llamadas o simplemente poder declarar una matriz aleatoria en una línea, puede hacer lo siguiente:
import random
def my_shuffle(array):
random.shuffle(array)
return array
Entonces puedes hacer líneas como:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
Cuando se trata de listas regulares de Python, random.shuffle()
hará el trabajo tal como lo muestran las respuestas anteriores.
Pero cuando se trata de ndarray
( numpy.array
), random.shuffle
parece romper el original ndarray
. Aquí hay un ejemplo:
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
Solo usa: np.random.shuffle(a)
Al igual que random.shuffle
, np.random.shuffle
baraja la matriz en el lugar.
En caso de que desee una nueva matriz, puede usar sample
:
import random
new_array = random.sample( array, len(array) )
Puede ordenar su matriz con clave aleatoria
sorted(array, key = lambda x: random.random())
la clave solo se lee una vez, por lo que comparar el elemento durante la clasificación sigue siendo eficiente.
pero parece que random.shuffle(array)
será más rápido ya que está escrito en C
array
quise decir el Random
elemento: es decir, en lambda
el random.random()
podría estar generando una nueva Random
instancia de clase cada vez. No estoy realmente seguro: en java
esta sería la forma incorrecta de hacerlo: debe crear un Random rng = Random()
y luego invocar el rng.nextGaussian()
. Pero no estoy seguro de cómo random.random()
funciona Python
No sé si lo usé, random.shuffle()
pero me devuelve 'Ninguno', así que escribí esto, podría ser útil para alguien
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
Tenga en cuenta que random.shuffle()
no debe usarse en matrices multidimensionales, ya que provoca repeticiones.
Imagine que desea barajar una matriz a lo largo de su primera dimensión, podemos crear el siguiente ejemplo de prueba,
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 a lo largo del primer eje, el elemento i-ésimo corresponde a una matriz de 2x3 donde todos los elementos son iguales a i.
Si utilizamos la función aleatoria correcta para matrices multidimensionales, es decir np.random.shuffle(x)
, la matriz se barajará a lo largo del primer eje según se desee. Sin embargo, el uso random.shuffle(x)
causará repeticiones. Puede verificar esto ejecutando len(np.unique(x))
después de barajar, lo que le da 10 (como se esperaba) con np.random.shuffle()
solo alrededor de 5 cuando lo usa random.shuffle()
.