Shuffle een array met Python, randomiseer array item Bestel met Python

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.shufflemethode 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 samplegebruiken:

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.shufflede 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.shufflede 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.shuffleen random.shufflevoeren in-place shuffles uit. Als u echter een shuffled array wilt retourneren, is numpy.random.permutationde 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().

Other episodes