임의의 수로 N차원 배열을 만들 수 있습니다. numpy에서 제공하는 random모듈(numpy.random)을 이용하면 되는데요. 난수 생성과 n차원 배열 생성에 대해 알아봅시다. 또한 seed값을 통해 난수생성을 제어해 봅시다.
np.random.normal()
np.random.randn()
np.random.rand()
np.random.randint()
np.random.seed()
arr = np.random.normal(0, 1, 10) #1차원 배열
print(arr)
>> [ 1.15144266 0.10447867 0.29986138 1.69781347 -0.33306531 -0.81657316
0.02298087 1.31738328 0.61346083 1.43470762]
arr2 = np.random.normal(0, 1, (2,2)) #2차원 배열
print(arr2)
>> [[ 0.38483288 1.03242822]
[-1.38313605 1.80518225]]
np.random.normal() 함수는 정규분포에서 임의의 수를 추출한 뒤, 그 수를 바탕으로 하는 N차원 배열을 생성합니다. 함수의 인자로는 (loc, scale, size)를 받으며, loc는 정규분포의 평균(μ), scale은 정규분포의 표준편차(σ), size는 정규분포에서 추출할 수의 규격을 의미합니다. 즉 상단 코드에서 np.random.normal(0, 1, 10)의 의미는 모평균 : 0, 표준편차 : 1의 정규분포에서 10개의 수를 추출하여 일차원 배열을 생성한다는 것입니다.
arr = np.random.randn(10) #1차원 배열
print(arr)
>> [-1.79343559 -0.84174737 0.50288142 -1.24528809 -1.05795222 -0.90900761
0.55145404 2.29220801 0.04153939 -1.11792545]
arr2 = np.random.randn(2, 2) #2차원 배열
print(arr2)
>> [[ 0.53905832 -0.5961597 ]
[-0.0191305 1.17500122]]
np.random.randn()함수는 표준정규분포표에서 임의의 수를 추출한뒤, 그 수를 바탕으로 하는 N차원 배열을 생성합니다. 표준정규분포표는 모평균과 표준편차가 각각 0과 1로 된 분포로 정규분포를 표준화하여 만들어집니다.
arr = np.random.rand(10) #1차원 배열
print(arr)
>> [0.84656149 0.07964548 0.50524609 0.0652865 0.42812233 0.09653092
0.12715997 0.59674531 0.226012 0.10694568]
arr2 = np.random.rand(2, 2) #2차원 배열
print(arr2)
>> [[0.22030621 0.34982629]
[0.46778748 0.20174323]]
np.random.rand()함수는 [0, 1)의 범위에서 균등하게 추출하여 N차원 배열을 생성합니다. 함수의 인자로는 추출하고 싶은 배열의 크기(size)를 받습니다.
arr = np.random.randint(1, 10, 10) #1차원 배열
print(arr)
>> [9 8 2 7 9 6 4 1 1 3]
arr2 = np.random.randint(1, 10, (2,2)) #2차원 배열
print(arr2)
>> [[9 9]
[3 7]]
np.random.randint()함수는 [low, high)의 범위에서 임의의 정수를 추출하여 N차원 배열을 생성합니다. 인자로는 (low, high, size)를 받습니다.
random모듈을 통한 난수 생성은 사실 엄격한 의미의 난수는 아닙니다. 특정 시작 숫자를 정해주면 일정한 알고리즘에 의해 마치 난수처럼 보이는 수들을 쏟아내는 것입니다. 이러한 시작 숫자를 우리는 시드(seed)라고 합니다.
이러한 원리를 통해 난수 생성을 제어할 수 있습니다. 즉, 시드(seed)를 정해주는 것으로부터 예측 가능한 난수를 배열에 사용할 수 있는 것입니다.
np.random.seed(2) #시드값을 2로 고정
arr = np.random.randint(1, 10, 10)
print(arr)
>> [9 9 7 3 9 8 3 2 6 5]
np.random.seed(200) #시드값을 200으로 변경
arr2 = np.random.randint(1, 10, 10)
print(arr2)
>> [1 5 8 7 9 2 8 4 2 8]
np.random.seed(2) #시드값을 2로 재변경
arr3 = np.random.randint(1, 10, 10)
pirnt(arr3)
>> [9 9 7 3 9 8 3 2 6 5]