Numpy의 random 서브 모듈을 활용해 다양한 ndarray를 만드는 방법을 정리합니다.

random 서브모듈 함수를 통해 ndarray 생성하기

1
import numpy as np

random 서브모듈

random 함수

  • 0 ~ 1 보다 작은 값의 범주에서 랜덤한 ndarray 생성

  • tuple 형식으로 입력해줘야 한다.

1
np.random.random((2,3))
array([[0.47703558, 0.80144711, 0.74040119],
       [0.31862146, 0.690049  , 0.82771048]])

rand 함수

  • 0, 1사이의 분포로 랜덤한 ndarray 생성
1
2
# 1차원
np.random.rand(2)
array([0.4431507 , 0.46957526])
1
2
# 2행 3열 의 ndarray생성
np.random.rand(2,3)
array([[0.70933344, 0.25348086, 0.63018799],
       [0.3784231 , 0.84538854, 0.59128912]])
1
np.random.random((2,3))
array([[0.90562321, 0.7034081 , 0.43548124],
       [0.31597773, 0.68466077, 0.68904796]])
1
2
# 5행 3열의 행렬이 4개 생성 ->3차원 ndarray
np.random.rand(4, 5, 3)
array([[[0.43037496, 0.45892116, 0.43941642],
        [0.30684635, 0.40820547, 0.32082638],
        [0.7299209 , 0.44457403, 0.76065168],
        [0.71211036, 0.12228115, 0.98060708],
        [0.47309384, 0.55434374, 0.21288774]],

       [[0.7030427 , 0.24030721, 0.89636842],
        [0.72449829, 0.94790877, 0.45735653],
        [0.31077326, 0.49873703, 0.65385706],
        [0.7214069 , 0.57174121, 0.65875851],
        [0.87494319, 0.04364989, 0.37346273]],

       [[0.83665403, 0.47537478, 0.24707776],
        [0.42113453, 0.68517459, 0.77690977],
        [0.31956091, 0.38027256, 0.57287284],
        [0.48671635, 0.47045021, 0.89825168],
        [0.59415424, 0.37183253, 0.6928423 ]],

       [[0.0917947 , 0.24222904, 0.35560574],
        [0.76962856, 0.17512692, 0.74138208],
        [0.08833711, 0.28558716, 0.45292481],
        [0.37076011, 0.14093546, 0.77660625],
        [0.21051989, 0.36251472, 0.81577139]]])

randn함수

  • n: normal distribution(정규분포)

  • 정규분포로 샘플링된 랜덤 ndarray 생성

1
2
# 1차원 벡터 
np.random.randn(5)
array([-1.51052048, -0.27519631, -0.8666378 , -1.63978589, -0.8215562 ])
1
2
# 3행 4열 짜리 정규분포에서 sampling한 값 생성
np.random.randn(3, 4)
array([[-0.72880075, -1.51866859,  1.59485183,  0.12828884],
       [-0.34870788, -0.94093072, -0.65373912, -0.34454653],
       [ 0.34429117, -0.67213369, -0.09330556, -0.19039838]])
1
2
# 4행 2열짜리 행렬을 3개 -> 3차원
np.random.randn(3, 4, 2)
array([[[-1.37911421,  0.39138757],
        [ 0.72435775, -0.32727131],
        [-1.17817337,  0.70851049],
        [ 0.47210005, -0.17513222]],

       [[-0.59636136,  0.30423486],
        [-0.28650705,  0.20916995],
        [ 1.74434258, -2.11632065],
        [-0.98421197, -1.38944896]],

       [[ 0.24653031, -1.44258126],
        [ 0.29318149, -0.2206329 ],
        [ 0.93137456, -0.87487388],
        [-0.55208743,  0.37306698]]])

randint 함수

  • 특정 정수 사이에서 랜덤하게 샘플링
1
2
# 1부터 100사이의 수에서 5행짜리 1차원 벡터를 생성
np.random.randint(1, 100, size=(5,))
array([35, 58, 84, 11, 11])
1
2
# 1부터 100사이의 수에서 5행 3열짜리 2차원 벡터를 생성
np.random.randint(1, 100, size=(5,3))
array([[ 5, 39, 71],
       [84, 23, 22],
       [99, 37, 47],
       [ 7, 11, 46],
       [42, 26, 44]])

seed 함수

  • 위에서 실습한 random함수는 실행할때마다 매번 값이 바뀌게 된다.

  • 랜덤한 값을 동일하게 다시 생성하고자 할때 사용

1
np.random.randn(3, 4)
array([[ 0.44477548, -0.37859929, -1.04881793,  1.05633961],
       [ 1.23118506,  0.47478283,  1.72586718, -0.01090185],
       [ 0.35476691, -1.16995451,  0.15202883, -0.27486997]])
1
np.random.randn(3, 4)
array([[-0.3978982 , -1.01173682,  0.40429942, -1.42901326],
       [-0.1511208 ,  0.15430208, -0.32847991, -0.64725463],
       [-1.69742934, -0.16331764,  0.10646885,  1.03418604]])

동일한 범위지만 호출할때마다 값이 바뀐다.

1
2
np.random.seed(23) #seed는 임의의 수 사용
np.random.randn(3, 4)
array([[ 0.66698806,  0.02581308, -0.77761941,  0.94863382],
       [ 0.70167179, -1.05108156, -0.36754812, -1.13745969],
       [-1.32214752,  1.77225828, -0.34745899,  0.67014016]])
1
2
np.random.seed(23)
np.random.randn(3, 4)
array([[ 0.66698806,  0.02581308, -0.77761941,  0.94863382],
       [ 0.70167179, -1.05108156, -0.36754812, -1.13745969],
       [-1.32214752,  1.77225828, -0.34745899,  0.67014016]])
  • seed를 선정했을 경우 동일 seed일때는 동일한 random값이 출력된다.

  • 실험할때나 쉐도잉을 할때 사용하면 유용하다.

choice

  • 주어진 1차원 ndarray로 부터 랜덤으로 샘플링

  • 정수가 주어진 경우, np.arange(해당숫자)로 간주

1
2
3
# 1부터 100사이의 수
# 3행 4열 ndarray생성
np.random.choice(100, size=(3, 4))
array([[79, 90, 62, 57],
       [19, 33, 59, 39],
       [15, 36, 65,  1]])
1
2
3
4
5
x = np.array([1, 2, 3, 1.5, 2.6, 4.9])

# 주어진 x에서 2행 2열 형태로 ndarray 생성
# replace = True가  default값 -> 중복 추출 허용
np.random.choice(x, size=(2, 2) )
array([[2.6, 1.5],
       [1.5, 2.6]])
1
2
# 중복 추출 금지
np.random.choice(x, size=(2, 2), replace=False)
array([[2.6, 1. ],
       [1.5, 4.9]])

확률분포에 따른 ndarray 생성

  • uniform

  • normal 등등

uniform 함수

1
2
3
# uniform -> low ~ high 사이의 값을 가져 오는 것
# 4행 5열 
np.random.uniform(1.0, 3.0, size=(4, 5))
array([[2.74942904, 1.8654592 , 2.75215591, 1.94121243, 1.60485579],
       [2.53464481, 1.02068753, 2.35248663, 1.94336175, 2.26833065],
       [2.84085397, 1.26336399, 2.67879335, 2.40971945, 2.93578399],
       [2.80844986, 1.58561196, 1.29487279, 1.28251   , 2.9085976 ]])

normal

  • 지정한 평균, 표준편차의 정규분포를 따르는 값으로만 ndarray생성
1
2
# 평균 0, 표준 편차 1의 정규 분포를 따르는 3*3 ndarray
np.random.normal(0, 1, (3, 3))
array([[-0.49566853, -0.01184144,  0.57898537],
       [-0.66227358,  1.33292115, -0.39404436],
       [-2.50408469, -1.37373969,  1.13563154]])

댓글남기기