Wie kann ich nicht repetitive Zufallszahlen in Numpy generieren?
list = np.random.random_integers(20,size=(10))
random
numpy
numbers
non-repetitive
Akademie
quelle
quelle
Antworten:
numpy.random.Generator.choice
bietet einreplace
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 Folgendesrandom.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.)quelle
import random
?random.sample(range(n), 10))
es auch für sehr große Objekte effizientn
, da einrange
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 ersetzenrange
mitxrange
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)
quelle
range(n)
(oderarange(n)
) als erstem Argument vonchoice
ist es gleichbedeutend mit nur bestandenn
, zchoice(20, 10, replace=False)
.np.random.choice(a, size, replace=False)
für große Geräte sehr langsam ista
- auf meinem Computer etwa 30 ms für a = 1M.n
Nutzung zu vermeidennumpy.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.
quelle
Sie können dies auch durch Sortieren erhalten:
random_numbers = np.random.random([num_samples, max_int]) samples = np.argsort(random_numbers, axis=1)
quelle
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.
quelle