Was ist der einfachste Weg, ein Array mit Python zu mischen?
new_array = random.sample( array, len(array) )
.
Was ist der einfachste Weg, ein Array mit Python zu mischen?
new_array = random.sample( array, len(array) )
.
Antworten:
import random
random.shuffle(array)
import random
random.shuffle(array)
Alternative Möglichkeit, dies mit sklearn zu tun
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)
Ausgabe:
[2, 1, 3]
['two', 'one', 'three']
Vorteil: Sie können mehrere Arrays gleichzeitig zufällig auswählen, ohne die Zuordnung zu stören. Und 'random_state' kann das Mischen für reproduzierbares Verhalten steuern.
Die anderen Antworten sind die einfachsten, es ist jedoch etwas ärgerlich, dass die random.shuffle
Methode eigentlich nichts zurückgibt - sie sortiert nur die angegebene Liste. Wenn Sie Anrufe verketten oder nur ein gemischtes Array in einer Zeile deklarieren möchten, haben Sie folgende Möglichkeiten:
import random
def my_shuffle(array):
random.shuffle(array)
return array
Dann können Sie Zeilen wie:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
Beim Umgang mit regulären Python-Listen random.shuffle()
erledigen Sie den Job genau so, wie die vorherigen Antworten zeigen.
Aber wenn es um ndarray
( numpy.array
) geht, random.shuffle
scheint das Original zu brechen ndarray
. Hier ist ein Beispiel:
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
Benutz einfach: np.random.shuffle(a)
Wie random.shuffle
, np.random.shuffle
mischt das Array an Ort und Stelle.
Nur für den Fall, dass Sie ein neues Array möchten, können Sie Folgendes verwenden sample
:
import random
new_array = random.sample( array, len(array) )
Sie können Ihr Array mit einem zufälligen Schlüssel sortieren
sorted(array, key = lambda x: random.random())
Schlüssel nur einmal gelesen werden, so dass der Vergleich des Elements während der Sortierung immer noch effizient ist.
aber wie random.shuffle(array)
es aussieht wird schneller sein, da es in C geschrieben ist
array
ich meinte nicht das ich meinte das Random
Element: dh in lambda
der random.random()
könnte Random
jedes Mal eine neue Klasseninstanz generiert werden. Ich bin mir eigentlich nicht sicher: java
Dies wäre der falsche Weg: Sie sollten ein erstellen Random rng = Random()
und dann das aufrufen rng.nextGaussian()
. Aber nicht sicher, wie Python random.random()
funktioniert
Ich weiß nicht, ob ich es verwendet habe, random.shuffle()
aber es gibt 'None' an mich zurück, also habe ich das geschrieben, könnte für jemanden hilfreich sein
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
Beachten Sie, dass random.shuffle()
nicht für mehrdimensionale Arrays verwendet werden sollte, da dies zu Wiederholungen führt.
Stellen Sie sich vor, Sie möchten ein Array entlang seiner ersten Dimension mischen. Wir können das folgende Testbeispiel erstellen:
import numpy as np
x = np.zeros((10, 2, 3))
for i in range(10):
x[i, ...] = i*np.ones((2,3))
so dass entlang der ersten Achse das i-te Element einer 2x3-Matrix entspricht, in der alle Elemente gleich i sind.
Wenn wir die richtige Mischfunktion für mehrdimensionale Arrays verwenden, dh np.random.shuffle(x)
das Array wird wie gewünscht entlang der ersten Achse gemischt. Die Verwendung random.shuffle(x)
führt jedoch zu Wiederholungen. Sie können dies überprüfen, indem Sie len(np.unique(x))
nach dem Mischen ausführen, was Ihnen 10 (wie erwartet) mit, np.random.shuffle()
aber nur etwa 5 bei Verwendung ergibt random.shuffle()
.