Wie kann ich nicht repetitive Zufallszahlen in Numpy generieren?
list = np.random.random_integers(20,size=(10))
Wie kann ich nicht repetitive Zufallszahlen in Numpy generieren?
list = np.random.random_integers(20,size=(10))
Antworten:
numpy.random.Generator.choice
bietet ein replace
Argument, um ersatzlos zu probieren:
from numpy.random import default_rng
rng = default_rng()
numbers = rng.choice(20, size=10, replace=False)
Wenn Sie ein NumPy vor 1.17 ohne Generator
API verwenden, können Sie Folgendes random.sample()
aus der Standardbibliothek verwenden:
print(random.sample(range(20), 10))
Sie können auch verwenden numpy.random.shuffle()
und in Scheiben schneiden, dies ist jedoch weniger effizient:
a = numpy.arange(20)
numpy.random.shuffle(a)
print a[:10]
Es gibt auch ein replace
Argument in der Legacy- numpy.random.choice
Funktion, aber dieses Argument wurde ineffizient implementiert und dann aufgrund von Stabilitätsgarantien für Zufallszahlenströme ineffizient gelassen, sodass seine Verwendung nicht empfohlen wird. (Grundsätzlich wird das Shuffle-and-Slice-Ding intern ausgeführt.)
import random
?
random.sample(range(n), 10))
es auch für sehr große Objekte effizient n
, da ein range
Objekt nur ein kleiner Wrapper ist, der Start-, Stopp- und Schrittwerte speichert, jedoch nicht die vollständige Liste der Ganzzahlen erstellt. In Python 2 können Sie ersetzen range
mit xrange
einem ähnlichen Verhalten zu bekommen.
Ich denke, numpy.random.sample
funktioniert momentan nicht. Das ist mein Weg:
import numpy as np
np.random.choice(range(20), 10, replace=False)
range(n)
(oder arange(n)
) als erstem Argument von choice
ist es gleichbedeutend mit nur bestanden n
, z choice(20, 10, replace=False)
.
np.random.choice(a, size, replace=False)
für große Geräte sehr langsam ist a
- auf meinem Computer etwa 30 ms für a = 1M.
n
Nutzung zu vermeiden numpy.random.Generator.choice
(beginnend mit numpy v1.17)
Jahre später einige Zeiträume für die Auswahl von 40000 aus 10000 ^ 2 (Numpy 1.8.1, imac 2.7 GHz):
import random
import numpy as np
n = 10000
k = 4
np.random.seed( 0 )
%timeit np.random.choice( n**2, k * n, replace=True ) # 536 µs ± 1.58 µs
%timeit np.random.choice( n**2, k * n, replace=False ) # 6.1 s ± 9.91 ms
# https://docs.scipy.org/doc/numpy/reference/random/index.html
randomstate = np.random.default_rng( 0 )
%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=False ) # 766 µs ± 2.18 µs
%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=True ) # 1.05 ms ± 1.41 µs
%timeit random.sample( range( n**2 ), k * n ) # 47.3 ms ± 134 µs
(Warum 40000 von 10000 ^ 2 wählen? Um große scipy.sparse.random-
Matrizen zu generieren
- scipy 1.4.1 verwendet np.random.choice( replace=False )
, slooooow.)
Tipp des Hutes an numpy.random Leute.
Generieren Sie einfach ein Array, das den erforderlichen Zahlenbereich enthält, und mischen Sie diese, indem Sie wiederholt ein zufälliges mit dem 0. Element im Array austauschen. Dies erzeugt eine zufällige Sequenz, die keine doppelten Werte enthält.