Qual è il modo più semplice per mescolare un array con Python?
new_array = random.sample( array, len(array) )
.
Qual è il modo più semplice per mescolare un array con Python?
new_array = random.sample( array, len(array) )
.
Risposte:
import random
random.shuffle(array)
import random
random.shuffle(array)
Modo alternativo per farlo 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)
Produzione:
[2, 1, 3]
['two', 'one', 'three']
Vantaggio: è possibile eseguire casualmente più array contemporaneamente senza interrompere la mappatura. E 'random_state' può controllare lo shuffle per comportamenti riproducibili.
Le altre risposte sono le più semplici, tuttavia è un po 'fastidioso che il random.shuffle
metodo in realtà non restituisca nulla, ma ordina semplicemente l'elenco fornito. Se vuoi concatenare le chiamate o essere in grado di dichiarare un array mischiato su una linea puoi fare:
import random
def my_shuffle(array):
random.shuffle(array)
return array
Quindi puoi fare linee come:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
Quando si ha a che fare con elenchi Python regolari, random.shuffle()
farà il lavoro proprio come mostrano le risposte precedenti.
Ma quando si tratta di ndarray
( numpy.array
), random.shuffle
sembra rompere l'originale ndarray
. Ecco un esempio:
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
Usa solo: np.random.shuffle(a)
Ad esempio random.shuffle
, np.random.shuffle
mescola l'array sul posto.
Nel caso in cui desideri un nuovo array puoi usare sample
:
import random
new_array = random.sample( array, len(array) )
È possibile ordinare l'array con chiave casuale
sorted(array, key = lambda x: random.random())
la chiave deve essere letta una sola volta, quindi confrontando l'elemento durante l'ordinamento è ancora efficiente.
ma sembra che random.shuffle(array)
sarà più veloce da quando è scritto in C
array
intendevo l' Random
elemento intendo l' elemento: vale a dire in lambda
the random.random()
potrebbe essere la generazione di nuove Random
istanze di classe ogni volta. In realtà non sono sicuro: in java
questo sarebbe il modo sbagliato di farlo: dovresti creare un Random rng = Random()
e quindi invocare il rng.nextGaussian()
. Ma non è sicuro come python random.random()
funziona
Non so di averlo usato random.shuffle()
ma mi restituisce "Nessuno", quindi ho scritto questo, potrebbe essere utile a qualcuno
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
Fai attenzione a random.shuffle()
non deve essere utilizzato su array multidimensionali poiché causa ripetizioni.
Immagina di voler mescolare un array lungo la sua prima dimensione, possiamo creare il seguente esempio di test,
import numpy as np
x = np.zeros((10, 2, 3))
for i in range(10):
x[i, ...] = i*np.ones((2,3))
in modo che lungo il primo asse, l'elemento i-esimo corrisponda a una matrice 2x3 in cui tutti gli elementi sono uguali a i.
Se utilizziamo la corretta funzione shuffle per array multidimensionali, ovvero np.random.shuffle(x)
l'array verrà mischiato lungo il primo asse come desiderato. Tuttavia, l'utilizzo random.shuffle(x)
provocherà ripetizioni. Puoi verificarlo eseguendolo len(np.unique(x))
dopo averlo mischiato che ti dà 10 (come previsto) con np.random.shuffle()
ma solo circa 5 quando lo usi random.shuffle()
.