참고: https://codetorial.net/numpy/random.html
In [2]:
import numpy as np
from numpy import random
In [4]:
a = np.random.rand(5)
print(a)
b = np.random.rand(2, 3) #2차원 2행 3열 형태
print(b)
[0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ]
[[0.64589411 0.43758721 0.891773 ]
[0.96366276 0.38344152 0.79172504]]
random.seed()¶
- 난수 생성에 필요한 시드를 설정
- 시드를 설정하면 코드를 실행할 때마다 동일한 난수가 생성되어 코드 디버깅과 같은 작업을 할 때 유용하게 사용할 수 있음
- 시드를 설정하지 않으면 호출할 때마다 매번 다른 숫자가 나타남
In [5]:
np.random.seed(0)
print(np.random.rand(2, 3))
[[0.5488135 0.71518937 0.60276338]
[0.54488318 0.4236548 0.64589411]]
In [6]:
#시각화
import matplotlib.pyplot as plt
np.random.seed(0)
plt.style.use('default')
plt.rcParams['figure.figsize'] = (6,3)
plt.rcParams['font.size'] = 12
a = np.random.rand(1000)
b = np.random.rand(10000)
c = np.random.rand(100000)
plt.hist(a, bins=100, density=True, alpha=0.5, histtype='step', label='n=1000')
plt.hist(b, bins=100, density=True, alpha=0.75, histtype='step', label='n=10000')
plt.hist(c, bins=100, density=True, alpha=1.0, histtype='step', label='n=100000')
plt.ylim(0, 2.5)
plt.legend()
plt.show()
- numpy와 matplotlib을 이용해서 난수 분포를 확인해보면 샘플의 개수가 늘어날수록 더욱 균일한 분포를 보임을 알 수 있음
random.randint()¶
- 이산형 균일분포를 이용하여 [최소값, 최대값)의 범위에서 임의의 정수를 만듬
- high가 지정되지 않은 경우에는 0 이상 low 미만 범위에서 난수 발생
In [7]:
a = np.random.randint(2, size=5)
print(a)
b = np.random.randint(2, 4, size=5)
print(b)
c = np.random.randint(1, 5, size=(2,3))
print(c)
[0 1 0 0 0]
[3 2 2 3 2]
[[1 1 4]
[3 2 2]]
In [10]:
#시각화
plt.style.use('default')
plt.rcParams['figure.figsize'] = (6,3)
plt.rcParams['font.size'] = 12
a = np.random.randint(0, 10, 1000)
b = np.random.randint(10, 20, 1000)
c = np.random.randint(0, 20, 1000)
plt.hist(a, bins=100, density=False, alpha=0.5, histtype='step', label='0<=randint<10')
plt.hist(b, bins=100, density=False, alpha=0.75, histtype='step', label='10<=randint<20')
plt.hist(c, bins=100, density=False, alpha=1.0, histtype='step', label='0<=randint<20')
plt.ylim(0, 150)
plt.legend()
plt.show()
random.randn()¶
- 표준정규분포로부터 샘플링된 난수를 반환하되, 지정한 차원을 갖는 넘파이 배열을 생성함
- 표준정규분포가 아닌 평균 μ , 표준편차 σ를 갖는 정규분포의 난수를 생성하기 위해서는 σ * np.random.randn(…) + μ와 같은 형태로 사용
In [11]:
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.57974651 -1.50154744 -0.25726311 -0.77517508 1.77123774]
[[-0.67243913 0.02917615 -1.09724227]
[-0.63493902 0.46816607 1.18841096]]
[2.43862603 2.06662223 2.40769165 5.56066041 4.99200266]
In [12]:
#시각화
plt.style.use('default')
plt.rcParams['figure.figsize'] = (6,3)
plt.rcParams['font.size'] = 12
a = np.random.randn(100000)
b = 2 * np.random.randn(100000) - 1 #평균 -1, 표준편차 2인 난수 100,000개
c = 4 * np.random.randn(100000) + 2 #평균 2, 표준편차 4
plt.hist(a, bins=100, density=True, alpha=0.5, histtype='step', label='(mean, stddev)=(0, 1)')
plt.hist(b, bins=100, density=True, alpha=0.75, histtype='step', label='(mean, stddev)=(-1, 2)')
plt.hist(c, bins=100, density=True, alpha=1.0, histtype='step', label='(mean, stddev)=(2, 4)')
plt.xlim(-15, 25)
plt.legend()
plt.show()
In [14]:
d = np.random.standard_normal(3)
print(d)
e = np.random.standard_normal((2, 3))
print(e)
[-0.83816548 -0.72118555 -0.61440978]
[[-0.10697798 1.35386978 1.47984529]
[ 1.24390135 1.28405155 1.34764525]]
In [15]:
#시각화
plt.style.use('default')
plt.rcParams['figure.figsize'] = (6, 3)
plt.rcParams['font.size'] = 12
a = np.random.standard_normal(1000)
b = np.random.standard_normal(10000)
c = np.random.standard_normal(100000)
plt.hist(a, bins=100, density=True, alpha=0.5, histtype='step', label='n=1000')
plt.hist(b, bins=100, density=True, alpha=0.75, histtype='step', label='n=10000')
plt.hist(c, bins=100, density=True, alpha=1.0, histtype='step', label='n=100000')
plt.legend()
plt.show()
In [16]:
a = np.random.normal(0, 1, 2) #(0, 1)에서 얻은 난수 2개
print(a)
b = np.random.normal(1.5, 1.5, 4) #(1.5, 1.5^)에서 얻은 난수 4개
print(b)
c = np.random.normal(3.0, 2.0, (2, 3)) #(3.0, 2.0^)에서 얻은 (2,3)형태
print(c)
[-0.34427064 -1.00990394]
[1.81986566 2.80882101 0.86968737 2.95460914]
[[ 1.66564469 4.10576726 6.58741329]
[ 2.98253492 4.00211777 -2.1559986 ]]
In [17]:
#시각화
plt.style.use('default')
plt.rcParams['figure.figsize'] = (6, 3)
plt.rcParams['font.size'] = 12
a = np.random.normal(0, 1, 500)
b = np.random.normal(1.5, 1.5, 5000)
c = np.random.normal(3.0, 2.0, 50000)
plt.hist(a, bins=100, density=True, alpha=0.75, histtype='step', label=r'N(0, $1^2$)')
plt.hist(b, bins=100, density=True, alpha=0.75, histtype='step', label=r'N(1.5, $1.5^2$)')
plt.hist(c, bins=100, density=True, alpha=0.75, histtype='step', label=r'N(3.0, $3.0^2$)')
plt.legend()
plt.show()
random.random_sample()¶
- [0.0, 1.0) 범위에서 샘플링된 임의의 실수를 반환함
- size를 지정하지 않으면 한 개의 값을, 지정하면 해당하는 차원을 갖는 넘파이 배열을 생성
- 만약 [0, 1) 범위가 아닌 [a, b) 범위의 난수를 생성하려면, (b-a) * rancom_sample() + a 와 같이 생성
In [18]:
a = np.random.random_sample()
print(a)
b = np.random.random_sample((5, 2))
print(b)
c = np.random.random_sample((3, 2)) - 3
print(c)
0.4687593475048125
[[0.22580275 0.65302636]
[0.66132409 0.87833194]
[0.44096291 0.12339182]
[0.72796661 0.9296729 ]
[0.18885479 0.10492386]]
[[-2.74971867 -2.28288289]
[-2.910685 -2.42223252]
[-2.83879802 -2.32826115]]
In [19]:
#시각화
plt.style.use('default')
plt.rcParams['figure.figsize'] = (6, 3)
plt.rcParams['font.size'] = 12
a = np.random.random_sample(100000)
b = 1.5 * np.random.random_sample(100000) - 0.75
c = 2 * np.random.random_sample(100000) - 1
plt.hist(a, bins=100, density=True, alpha=0.75, histtype='step', label='[0, 1)')
plt.hist(b, bins=100, density=True, alpha=0.75, histtype='step', label='[-0.75, 0.75)')
plt.hist(c, bins=100, density=True, alpha=0.75, histtype='step', label='[-1, 1)')
plt.ylim(0.0, 1.2)
plt.legend()
plt.show()
random.choice()¶
- 주어진 1차원 array로부터 size로 지정된 개수만큼 임의의 샘플을 생성함
- replace 파라미터를 이용해 복원추출 여부 지정(디폴트는 복원추출 허용, replace=True)
- 복원 추출을 하지 않는다고 지정할 때, size를 배열의 크기보다 크게 설정하면 에러 발생
In [21]:
a = np.random.choice(5, 3) #np.arange(5)에서 3개를 뽑은 1차원 어레이
print(a)
b = np.random.choice(10, (2, 3)) ##np.arange(10)에서 뽑은 (2,3)형태의 어레이
print(b)
[0 0 4]
[[9 4 7]
[5 7 1]]
In [22]:
a = np.random.choice([1,2,3,4,5], size=5, replace=True)
b = np.random.choice([1,2,3,4,5], size=5, replace=False)
print(a)
print(b)
[4 3 4 1 3]
[4 3 1 5 2]
In [23]:
#에러 발생 경우
a = random.choice([1,2,3,4,5], size=10, replace=False)
print(a)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_27572\957461874.py 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'
In [24]:
#시각화
plt.style.use('default')
plt.rcParams['figure.figsize'] = (6, 3)
plt.rcParams['font.size'] = 12
a = np.random.choice(10, 1000)
b = np.random.choice([0,1,2,4,8], 1000)
plt.hist(a, bins=100, density=False, alpha=0.75, histtype='step', label='Sample np.arange(5)')
plt.hist(b, bins=100, density=False, alpha=0.75, histtype='step', label='Sample [0, 1, 2, 4, 8]')
plt.ylim(0, 300)
plt.legend()
plt.show()
'Python > Numpy' 카테고리의 다른 글
넘파이 numpy (5) - concatenate(), 배열 합치기 (1) | 2023.05.22 |
---|---|
넘파이 numpy (3) - 행렬 정렬, 내적, 전치 (0) | 2023.04.21 |
넘파이 numpy (2) - arange, reshape, indexing (0) | 2023.04.21 |
넘파이 numpy (1) - ndarray, dtype, astype (0) | 2023.04.21 |