Jak mogę wygenerować niepowtarzalne liczby losowe w numpy?
list = np.random.random_integers(20,size=(10))
Jak mogę wygenerować niepowtarzalne liczby losowe w numpy?
list = np.random.random_integers(20,size=(10))
Odpowiedzi:
numpy.random.Generator.choice
oferuje replace
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
korzystasz random.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 starszej numpy.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).
import random
?
random.sample(range(n), 10))
będzie wydajne nawet dla bardzo dużych n
, 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
z xrange
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)
range(n)
(lub arange(n)
) jako pierwszego argumentu choice
, jest to równoznaczne z przekazaniem n
, np choice(20, 10, replace=False)
.
np.random.choice(a, size, replace=False)
jest to bardzo wolne dla dużych a
- na moim komputerze około 30 ms dla a = 1M.
n
zastosowaniach numpy.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.
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.