본문 바로가기
Tensorflow

[Tensorflow 2.0] 02. NumPy Basic (2)

by 청양호박이 2020. 1. 21.

이번에는 지난번에 알아본 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-

댓글