이번에는 지난번에 알아본 NumPy에 대해서 나머지 부분에 대해서 마무리 해 보겠습니다.
- NumPy 란? .................................................................... (1)
- Matrix Creation ........................................................... (1)
- Matrix Manipulation ................................................. (1)
- Matrix Operation ........................................................ (2)
- Wrap-Up ........................................................................ (2)
나머지 배열 연산과... 정리의 시간입니다.
4. Matrix Operation
Matrix에 대한 연산은 총 4가지를 알아보겠습니다.
- Matrix Multiplication (배열 곱)
- Element-wise Multiplication (원소 곱)
- SUM (합)
- Mean (평균)
[Matrix Multiplication]
배열 곱 과 원소 곱이 약간 헷갈릴 수 있습니다. 우선 Matrix Multiplication은 수학시간에 배우는 행렬의 곱에 대한 방법입니다.
확인을 위해서 코드로 풀어내면 아래와 같습니다.
import numpy as np
mat_a = np.arange(1,5).reshape(2,2)
mat_b = np.arange(5,9).reshape(2,2)
print(mat_a)
print(mat_b)
print('==============')
mat_c = np.matmul(mat_a, mat_b)
print(mat_c)
#####################################
[[1 2]
[3 4]]
[[5 6]
[7 8]]
==============
[[19 22]
[43 50]]
[Element-wise Multiplication]
그럼 원소 곱은 도데체 무엇일까요?? 수학적인 개념만 가지고 있는 상태라면 좀 생소할 수 있지만, 각 동일한 위치에 있는 원소끼리의 곱을 결과로 내주는 것이 이 방법입니다. numpy에서 아무생각없이 언어의 곱셈 (*)을 사용하면 그 결과가 나오게 됩니다.
원소 곱을 사용하는 방법은 2가지가 있습니다. np.multiply 메서드를 사용하는 방법과 연산자(*)사용하는 방법입니다.
list_a = [[1,3,5],[2,4,6]]
list_b = [[1,2,3],[4,5,6]]
mat_a = np.array(list_a)
mat_b = np.array(list_b)
mat_c = np.multiply(mat_a, mat_b)
print(mat_c)
print('==============')
mat_c = mat_a * mat_b
print(mat_c)
#################################
[[ 1 6 15]
[ 8 20 36]]
==============
[[ 1 6 15]
[ 8 20 36]]
[SUM]
이번에는 합을 구하는 방법입니다. 단순한 행렬간의 합이 아니고, 하나의 행렬 내에서 행끼리의 합!! 열끼리의 합!! 을 구하는 방법 입니다. 행렬간에 합은 연산자를 사용하면 되니... 생략하겠습니다... 라고 하면 섭하니 간단하게 보자면
list_a = [[1,3,5],[2,4,6]]
list_b = [[1,2,3],[4,5,6]]
mat_a = np.array(list_a)
mat_b = np.array(list_b)
mat_c = mat_a + mat_b
print(mat_c)
##########################
[[ 2 5 8]
[ 6 9 12]]
이렇게 행의 방향으로 합을 구하여 결과를 도출해 주는 방식이 axis=0이고, 열의 방향으로 합을 구하여 결과를 도출해 주는 방식이 axis=1입니다. 소스로 확인해 보면...
mat_sum = np.arange(9).reshape(3,3)
print(mat_sum)
print()
mat_sum_0 = np.sum(mat_sum, axis=0)
print('axis=0 합')
print(mat_sum_0)
print()
mat_sum_1 = np.sum(mat_sum, axis=1)
print('axis=1 합')
print(mat_sum_1)
####################################
[[0 1 2]
[3 4 5]
[6 7 8]]
axis=0 합
[ 9 12 15]
axis=1 합
[ 3 12 21]
이렇게 합을 구해줍니다.
[Mean]
평균은 Sum과 동일하고 도출되는 결과만 평균이 나옵니다. 너무나 같아서 소스만 보겠습니다.
mat_sum = np.arange(9).reshape(3,3)
print(mat_sum)
print()
mat_sum_0 = np.mean(mat_sum, axis=0)
print('axis=0 평균')
print(mat_sum_0)
print()
mat_sum_1 = np.mean(mat_sum, axis=1)
print('axis=1 평균')
print(mat_sum_1)
#####################################
[[0 1 2]
[3 4 5]
[6 7 8]]
axis=0 평균
[3. 4. 5.]
axis=1 평균
[1. 4. 7.]
5. Wrap-Up
그럼 지금까지 봤던 내용을 기준으로, 정리를 해보겠습니다. 정리는 역시 연습용 문제를 만들어서 풀어보는게 좋겠죠??
- 2개의 np.array를 생성하되 하나는 random으로 정규분포를 갖는 아이를 생성하고, 다른 아이는 최대10 최소0의 범위를 갖게 생성. 단, 모양은 3x5로 동일하게 생성
- 둘중에 하나를 transpose 시킴
- matrix multiplication을 수행하여 하나의 matrix생성
- 이의 행/열 합 및 평균을 각각 구함
이정도면 2단계에 걸친 numpy 요약이 될 것 같습니다.
mat_a = np.random.uniform(low=0, high=10, size=[3,5])
mat_b = np.random.normal(0, 1, size=[3,5])
print('mat_a : ')
print(mat_a)
print('mat_b : ')
print(mat_b)
print()
mat_b_t = np.transpose(mat_b)
print('mat_b_t : ')
print(mat_b_t)
print()
mat_c = np.matmul(mat_a, mat_b_t)
print('mat_c : ')
print(mat_c)
print()
mat_sum_0 = np.sum(mat_c, axis=0)
print('axis=0 합')
print(mat_sum_0)
print()
mat_sum_1 = np.sum(mat_c, axis=1)
print('axis=1 합')
print(mat_sum_1)
mat_mean_0 = np.mean(mat_c, axis=0)
print('axis=0 평균')
print(mat_mean_0)
print()
mat_mean_1 = np.mean(mat_c, axis=1)
print('axis=1 평균')
print(mat_mean_1)
##############################################
mat_a :
[[1.58000068 8.13153559 1.98991182 4.25308238 6.02684088]
[4.94977058 8.23023297 7.89461582 2.87128675 9.25947761]
[1.65521408 3.54656532 0.44067724 2.28753252 0.46630285]]
mat_b :
[[ 0.26497854 1.16334127 -0.96567452 2.15713571 -0.31967757]
[-1.35639729 0.51783554 -1.22657755 0.01268522 -0.97986903]
[ 0.56344688 1.79168133 2.05129164 0.5332652 -0.87362203]]
mat_b_t :
[[ 0.26497854 -1.35639729 0.56344688]
[ 1.16334127 0.51783554 1.79168133]
[-0.96567452 -1.22657755 2.05129164]
[ 2.15713571 0.01268522 0.5332652 ]
[-0.31967757 -0.97986903 -0.87362203]]
mat_c :
[[ 15.20464011 -6.22465511 16.54409628]
[ 6.49623124 -21.17195922 27.17092065]
[ 8.92436276 -1.37701299 9.00338667]]
axis=0 합
[ 30.62523411 -28.77362732 52.71840359]
axis=1 합
[25.52408128 12.49519266 16.55073644]
axis=0 평균
[10.20841137 -9.59120911 17.5728012 ]
axis=1 평균
[8.50802709 4.16506422 5.51691215]
사실 numpy에는 이것보다 더 할말이 많지만... 일단 Basic은 이정도에서 마무리하도록 하겠습니다.
-Ayotera Lab-
댓글