Jaki jest najłatwiejszy sposób przetasowania tablicy za pomocą Pythona?
new_array = random.sample( array, len(array) )
.
Jaki jest najłatwiejszy sposób przetasowania tablicy za pomocą Pythona?
new_array = random.sample( array, len(array) )
.
Odpowiedzi:
import random
random.shuffle(array)
import random
random.shuffle(array)
Alternatywny sposób to zrobić za pomocą 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)
Wynik:
[2, 1, 3]
['two', 'one', 'three']
Korzyść: możesz losować wiele tablic jednocześnie, bez zakłócania mapowania. A „random_state” może kontrolować tasowanie w celu uzyskania powtarzalnego zachowania.
Inne odpowiedzi są najłatwiejsze, jednak nieco denerwujące jest to, że random.shuffle
metoda nic nie zwraca - po prostu sortuje podaną listę. Jeśli chcesz połączyć wywołania lub po prostu móc zadeklarować przetasowaną tablicę w jednym wierszu, możesz:
import random
def my_shuffle(array):
random.shuffle(array)
return array
Następnie możesz wykonać linie takie jak:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
W przypadku zwykłych list w języku Python random.shuffle()
wykona zadanie dokładnie tak, jak pokazują poprzednie odpowiedzi.
Ale jeśli chodzi o ndarray
( numpy.array
), random.shuffle
wydaje się , że łamie oryginał ndarray
. Oto przykład:
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
Po prostu użyj: np.random.shuffle(a)
Jak random.shuffle
, np.random.shuffle
tasuje tablicę w miejscu.
Na wypadek, gdybyś potrzebował nowej tablicy, której możesz użyć sample
:
import random
new_array = random.sample( array, len(array) )
Możesz posortować tablicę za pomocą losowego klucza
sorted(array, key = lambda x: random.random())
klucz można odczytać tylko raz, więc porównywanie pozycji podczas sortowania jest nadal skuteczne.
ale wygląda na to, random.shuffle(array)
że będzie szybszy, ponieważ napisano w C.
array
mam na myśli Random
elementu: czyli w może być tworzenie nowych instancji klasy każdym razem. Nie jestem do końca pewien: w ten sposób byłby to niewłaściwy sposób: należy utworzyć a, a następnie wywołać . Ale nie jestem pewien, jak działa Pythonlambda
random.random()
Random
java
Random rng = Random()
rng.nextGaussian()
random.random()
Nie wiem, czy użyłem, random.shuffle()
ale zwraca mi „Brak”, więc napisałem to, może komuś pomóc
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
Należy pamiętać, że random.shuffle()
nie należy go stosować w tablicach wielowymiarowych, ponieważ powoduje to powtórzenia.
Wyobraź sobie, że chcesz przetasować tablicę wzdłuż jej pierwszego wymiaru, możemy utworzyć następujący przykład testu:
import numpy as np
x = np.zeros((10, 2, 3))
for i in range(10):
x[i, ...] = i*np.ones((2,3))
tak, że wzdłuż pierwszej osi i-ty element odpowiada macierzy 2x3, w której wszystkie elementy są równe i.
Jeśli użyjemy prawidłowej funkcji losowania dla tablic wielowymiarowych, tzn np.random.shuffle(x)
. Tablica zostanie przetasowana wzdłuż pierwszej osi zgodnie z potrzebami. Jednak użycie random.shuffle(x)
spowoduje powtórzenia. Możesz to sprawdzić, uruchamiając len(np.unique(x))
po tasowaniu, co daje 10 (zgodnie z oczekiwaniami) z, np.random.shuffle()
ale tylko około 5 podczas używania random.shuffle()
.