오늘 할 일: 갈고 닦기

제가 매일 까먹어서 작성합니다... 본 포스팅에서는 numpy의 서브모듈인 random을 이용하여 난수를 생성하는 방법을 알아보겠습니다. random은 난수를 발생시키는 모듈로 randint, hoice, randint, uniform 등의 메서드를 내장하고 있습니다. 아래 코드를 통해 로드한 후 사용하는데, 기본 모듈인 random과 혼동되지 않도록 주의하세요.

from numpy import random

 

난수(亂數, Random Number)란 정의된 범위 내에서 무작위로 추출된 수를 일컫는다. 난수는 누구라도 그 다음에 나올 값을 확신할 수 없어야 한다. (출처: 위키백과)

 

1. seed

시드 설정을 할 때마다 동일한 숫자 세트가 나타나 코드 디버깅과 같은 작업을 할 때 유용하게 사용할 수 있습니다. 시드를 설정하지 않으면 호출할 때마다 매번 다른 숫자가 나타납니다.

  • 시드를 설정하지 않는 경우
from numpy import random

print(random.randint(5, size=5)) 
print(random.randint(5, size=5))
[4 3 3 3 3]
[2 1 3 2 2]

 

  • 시드를 설정하는 경우
random.seed(2021)
print(random.randint(5, size=5)) 
random.seed(2021)
print(random.randint(5, size=5))​
[4 1 0 4 3]
[4 1 0 4 3]

 

 

2.  randint

이산형 균일분포(discrete uniform distribution)를 이용하여 low 이상 high 미만인 범위에서 size 개수만큼 임의의 정수를 반환합니다. high가 지정되지 않은 경우에는 0 이상 low 미만인 범위에서 난수를 발생시킵니다.

a = random.randint(low=5, size=5) 
b = random.randint(low=5, high=11, size=5)
print(a, b)
[1 2 3 3 4]
[8 6 9 6 6]

 

 

3. random_sample

연속형 균일분포(continuous uniform distribution)를 이용하여 0 이상 1 미만인 범위에서 샘플링된 임의의 실수를 반환합니다. size를 지정하지 않으면 값 하나를, size를 지정하면 해당하는 차원을 갖는 넘파이 배열을 생성합니다.

a = random.random_sample()
b = random.random_sample(size=(3, 2))
print(a)
print(b)
[0.28436423]
[[0.53395453 0.18629699]
 [0.81657607 0.7911602 ]
 [0.23216843 0.60096607]]

 

만약 a 이상 b 미만인 범위에서 임의의 실수를 샘플링 하고 싶다면 random_sample 된 값에 (b - a)를 곱하고 a를 더하여 얻을 수 있습니다.

ex) 4 이상 11 미만인 범위에서 값 5개 랜덤 샘플링하기

(11 - 4) * random.random_sample(size=5) + 4
array([ 8.31459136,  9.91976982, 10.98598306,  5.06016401,  8.64806218])

 

 

4. randn

표준정규분포(Standard normal distribution)로부터 샘플링된 난수를 반환하되, 지정한 차원을 갖는 넘파이 배열을 생성합니다.

표준정규분포: 평균이 0이고 표준편차가 1인 정규분포 N(0, 1)
a = random.randn(5) # shape=(5,)인 1차원 배열
b = random.randn(2, 3) # shape=(2, 3)인 2차원 배열
print(a)
print(b)
[ 1.33488977 -1.14471142 -0.75539711 -1.73649449 -0.53117036]
[[ 0.1287263  -0.49628474 -0.08270776]
 [ 0.09965789 -0.80550073 -1.08273807]]

 

 

4. choice

주어진 1차원 배열로부터 size로 지정된 개수만큼 랜덤 샘플링을 수행합니다. replace 파라미터를 이용해 복원추출 여부를 지정할 수 있습니다.(디폴트는 복원추출 허용입니다)

a = random.choice([1, 2, 3, 4, 5], size=5, replace=True)  # 복원추출
b = random.choice([1, 2, 3, 4, 5], size=5, replace=False) # 비복원추출
print(a)
print(b)
[1 1 1 3 2]
[3 1 5 2 4]

 

복원추출을 하지 않는다고 지정했을 때, size를 배열의 크기보다 크게 설정하면 아래와 같은 에러가 발생하니 주의하세요.

a = random.choice([1, 2, 3, 4, 5], size=10, replace=False)
print(a)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-25-dad8922a6f99> in <module>
----> 1 a = random.choice([1, 2, 3, 4, 5], size=10, replace=False)
      2 print(a)

mtrand.pyx in numpy.random.mtrand.RandomState.choice()

ValueError: Cannot take a larger sample than population when 'replace=False'

 

 

참고

https://numpy.org/doc/stable/index.html

 

Overview — NumPy v1.21 Manual

 

numpy.org

https://codetorial.net/numpy/random.html

 

NumPy 난수 생성 (Random 모듈) - Codetorial

예제1 - 기본 사용 import numpy as np a = np.random.randn(5) print(a) b = np.random.randn(2, 3) print(b) sigma, mu = 1.5, 2.0 c = sigma * np.random.randn(5) + mu print(c) [ 0.06704336 -0.48813686 0.4275107 -0.9015714 -1.30597604] [[ 0.87354043 0.03783

codetorial.net