제가 매일 까먹어서 작성합니다... 본 포스팅에서는 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
https://codetorial.net/numpy/random.html
'繩鋸木斷水滴石穿 > Python' 카테고리의 다른 글
[pandas] 칼럼 이름 변경하기: rename, set_index, columns (0) | 2021.10.31 |
---|---|
imblearn 모듈을 이용한 불균형 데이터 다루기 (0) | 2021.10.11 |
[pandas] rank와 sort_values를 이용하여 순위 매기기(부제: 여러 변수를 이용하여 순위 매기기) (0) | 2021.09.22 |
[pandas] 데이터 재구성: wide_to_long 함수와 melt 함수 (0) | 2021.08.29 |
[시각화] subplots와 반복문을 이용하여 그래프 여러개 그리기 (0) | 2021.08.14 |