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.shuffleMethode 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.shufflescheint 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.shufflemischt 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
arrayich meinte nicht das ich meinte das RandomElement: dh in lambdader random.random()könnte Randomjedes Mal eine neue Klasseninstanz generiert werden. Ich bin mir eigentlich nicht sicher: javaDies 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().