Jak mogę wygenerować niepowtarzalne liczby losowe w numpy?
list = np.random.random_integers(20,size=(10))
random
numpy
numbers
non-repetitive
Academia
źródło
źródło
Odpowiedzi:
numpy.random.Generator.choice
oferujereplace
argument do próbkowania bez wymiany:from numpy.random import default_rng rng = default_rng() numbers = rng.choice(20, size=10, replace=False)
Jeśli
Generator
korzystaszrandom.sample()
z NumPy w wersji starszej niż 1.17, bez API, możesz użyć z biblioteki standardowej:print(random.sample(range(20), 10))
Możesz także użyć
numpy.random.shuffle()
i pokroić, ale będzie to mniej wydajne:a = numpy.arange(20) numpy.random.shuffle(a) print a[:10]
Istnieje również
replace
argument w starszejnumpy.random.choice
funkcji, ale ten argument został zaimplementowany nieefektywnie, a następnie pozostawił nieefektywny ze względu na gwarancje stabilności strumienia liczb losowych, więc jego użycie nie jest zalecane. (Zasadniczo robi to wewnętrznie tasuj i pokrój).źródło
import random
?random.sample(range(n), 10))
będzie wydajne nawet dla bardzo dużychn
, ponieważrange
obiekt jest tylko małym opakowaniem przechowującym wartości start, stop i step, ale nie tworzy pełnej listy liczb całkowitych. W Pythonie 2, można wymienićrange
zxrange
aby uzyskać podobne zachowanie.Myślę, że
numpy.random.sample
teraz nie działa dobrze. To jest mój sposób:import numpy as np np.random.choice(range(20), 10, replace=False)
źródło
range(n)
(lubarange(n)
) jako pierwszego argumentuchoice
, jest to równoznaczne z przekazaniemn
, npchoice(20, 10, replace=False)
.np.random.choice(a, size, replace=False)
jest to bardzo wolne dla dużycha
- na moim komputerze około 30 ms dla a = 1M.n
zastosowaniachnumpy.random.Generator.choice
(począwszy od numpy v1.17)Lata później, trochę czasu na wybranie 40000 z 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
(Dlaczego 40000 z 10000 ^ 2 do generowania dużych? Scipy.sparse.random matryce - scipy 1.4.1 niej korzysta
np.random.choice( replace=False )
., Slooooow)Końcówka kapelusza dla numpy.random people.
źródło
Możesz to również uzyskać, sortując:
random_numbers = np.random.random([num_samples, max_int]) samples = np.argsort(random_numbers, axis=1)
źródło
Po prostu wygeneruj tablicę zawierającą wymagany zakres liczb, a następnie przetasuj je, wielokrotnie zamieniając losową z zerowym elementem tablicy. Daje to losową sekwencję, która nie zawiera zduplikowanych wartości.
źródło