Wat is de eenvoudigste manier om een array met Python te schudden?
Antwoord 1, Autoriteit 100%
import random
random.shuffle(array)
Antwoord 2, Autoriteit 21%
import random
random.shuffle(array)
Antwoord 3, Autoriteit 8%
Alternatieve manier om dit te doen met 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)
Uitgang:
[2, 1, 3]
['two', 'one', 'three']
Voordeel: u kunt gelijktijdig meerdere arrays tegelijkertijd zonder de mapping te verstoren. En ‘Random_State’ kan de shuffelen regelen voor reproduceerbaar gedrag.
Antwoord 4, Autoriteit 4%
De andere antwoorden zijn het gemakkelijkst, maar het is een beetje vervelend dat de random.shuffle
methode niet echt iets retourneert – het sorteert gewoon de opgegeven lijst. Als u oproepen wilt aanroepen of gewoon een geschikte array in één regel kunt declareren, kunt u doen:
import random
def my_shuffle(array):
random.shuffle(array)
return array
Dan kunt u lijnen doen zoals:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
Antwoord 5, Autoriteit 3%
Voor het geval je een nieuwe array wilt, kun je sample
gebruiken:
import random
new_array = random.sample( array, len(array) )
Antwoord 6, autoriteit 2%
Als het om gewone Python-lijsten gaat, zal random.shuffle()
het werk doen, net zoals de vorige antwoorden laten zien.
Maar als het gaat om ndarray
(numpy.array
), lijkt random.shuffle
de originele ndarray
. Hier is een voorbeeld:
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
Gebruik gewoon: np.random.shuffle(a)
Net als random.shuffle
, schudt np.random.shuffle
de array op zijn plaats.
Antwoord 7
U kunt uw array sorteren met een willekeurige sleutel
sorted(array, key = lambda x: random.random())
sleutel kan maar één keer worden gelezen, dus het vergelijken van items tijdens het sorteren is nog steeds efficiënt.
maar het lijkt erop dat random.shuffle(array)
sneller zal zijn omdat het in C is geschreven
dit is O(log(N)) btw
Antwoord 8
In aanvulling op de vorige reacties, wil ik graag nog een functie introduceren.
numpy.random.shuffle
en random.shuffle
voeren in-place shuffles uit. Als u echter een shuffled array wilt retourneren, is numpy.random.permutation
de functie die u moet gebruiken.
Antwoord 9
Ik weet niet of ik random.shuffle()
heb gebruikt, maar het geeft mij ‘Geen’ terug, dus ik schreef dit, kan iemand helpen
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
Antwoord 10
# arr = numpy array to shuffle
def shuffle(arr):
a = numpy.arange(len(arr))
b = numpy.empty(1)
for i in range(len(arr)):
sel = numpy.random.random_integers(0, high=len(a)-1, size=1)
b = numpy.append(b, a[sel])
a = numpy.delete(a, sel)
b = b[1:].astype(int)
return arr[b]
Antwoord 11
Houd er rekening mee dat random.shuffle()
niet op multi-dimensionale arrays mogen worden gebruikt, omdat het herhalingen veroorzaakt.
Stel je voor dat je een array langs de eerste dimensie wilt schudden, we kunnen het volgende testvoorbeeld maken,
import numpy as np
x = np.zeros((10, 2, 3))
for i in range(10):
x[i, ...] = i*np.ones((2,3))
Zodat het I-TH-element langs de eerste as overeenkomt met een 2×3-matrix waarbij alle elementen gelijk zijn aan I.
Als we de juiste shuffle-functie gebruiken voor multi-dimensionale arrays, d.w.z. np.random.shuffle(x)
, wordt de array langs de eerste as naar wens geschud. Gebruikt echter random.shuffle(x)
zal herhalingen veroorzaken. U kunt dit controleren door len(np.unique(x))
NA SHUFFTING te gebruiken die u 10 (zoals verwacht) geeft met np.random.shuffle()
maar alleen in de buurt 5 Bij gebruik van random.shuffle()
.