numpy에서 반복되지 않는 난수를 어떻게 생성 할 수 있습니까?
list = np.random.random_integers(20,size=(10))
numpy에서 반복되지 않는 난수를 어떻게 생성 할 수 있습니까?
list = np.random.random_integers(20,size=(10))
답변:
numpy.random.Generator.choice
replace
대체하지 않고 샘플에 대한 인수를 제공합니다 .
from numpy.random import default_rng
rng = default_rng()
numbers = rng.choice(20, size=10, replace=False)
Generator
API 없이 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
기능은, 그러나 그것의 사용은 권장되지 않도록이 인수로 인해 난수 스트림 안정성 보장에 비효율적으로하고 비효율적 인 왼쪽으로 구현되었습니다. (기본적으로 내부적으로 셔플 및 슬라이스 작업을 수행합니다.)
import random
?
random.sample(range(n), 10))
매우 큰 경우에도 효율적 입니다. 파이썬이, 당신은 대체 할 수 와 비슷한 동작을 얻을 수 있습니다. n
range
range
xrange
지금은 numpy.random.sample
작동하지 않는 것 같습니다. 이게 내 방법이야:
import numpy as np
np.random.choice(range(20), 10, replace=False)
range(n)
(또는 그 arange(n)
중 첫 번째 인수 등) choice
, 그냥 통과 동등 n
예 choice(20, 10, replace=False)
.
np.random.choice(a, size, replace=False)
대형 매우 느리게 a
- 내 컴퓨터에서은을 위해 약 30 밀리 1M를 =.
n
사용시 시간 및 메모리 문제를 방지하려면 numpy.random.Generator.choice
(numpy v1.17부터 시작)
몇 년 후, 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 사람들에게 모자 팁.
필요한 범위의 숫자를 포함하는 배열을 생성 한 다음 임의의 숫자를 배열의 0 번째 요소와 반복적으로 교체하여 섞습니다. 이것은 중복 값을 포함하지 않는 임의의 시퀀스를 생성합니다.