[random] numpy의 반복되지 않는 난수

numpy에서 반복되지 않는 난수를 어떻게 생성 할 수 있습니까?

list = np.random.random_integers(20,size=(10))



답변

numpy.random.Generator.choicereplace대체하지 않고 샘플에 대한 인수를 제공합니다 .

from numpy.random import default_rng

rng = default_rng()
numbers = rng.choice(20, size=10, replace=False)

GeneratorAPI 없이 1.17 이전 NumPy 를 사용 random.sample()하는 경우 표준 라이브러리에서 사용할 수 있습니다 .

print(random.sample(range(20), 10))

사용 numpy.random.shuffle()및 슬라이스도 가능하지만 효율성이 떨어집니다.

a = numpy.arange(20)
numpy.random.shuffle(a)
print a[:10]

거기이기도 replace기존의 인수 numpy.random.choice기능은, 그러나 그것의 사용은 권장되지 않도록이 인수로 인해 난수 스트림 안정성 보장에 비효율적으로하고 비효율적 인 왼쪽으로 구현되었습니다. (기본적으로 내부적으로 셔플 및 슬라이스 작업을 수행합니다.)


답변

지금은 numpy.random.sample작동하지 않는 것 같습니다. 이게 내 방법이야:

import numpy as np
np.random.choice(range(20), 10, replace=False)


답변

몇 년 후, 10000 ^ 2 (Numpy 1.8.1, imac 2.7GHz) 중 40000을 선택하는 시간이 있습니다.

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

(왜 10000 ^ 2 중에서 40000을 선택합니까? 큰 scipy.sparse.random
행렬 을 생성하려면
np.random.choice( replace=False )-scipy 1.4.1 사용 , slooooow.)

numpy.random 사람들에게 모자 팁.


답변

정렬하여 얻을 수도 있습니다.

random_numbers = np.random.random([num_samples, max_int])
samples = np.argsort(random_numbers, axis=1)


답변

필요한 범위의 숫자를 포함하는 배열을 생성 한 다음 임의의 숫자를 배열의 0 번째 요소와 반복적으로 교체하여 섞습니다. 이것은 중복 값을 포함하지 않는 임의의 시퀀스를 생성합니다.


답변