[Python.NumPy] 차원별 sum 합, std 표준편차 구하기 - Operation Function I

2020. 12. 8. 05:00Python과 머신러닝/NumPy 데이터 분석

0. 요약

  • 여태까지는 주로 2차원 배열을 사용했지만, 실제 데이터는 3차원 이상의 데이터도 많다.
  • 2차원 데이터의 합/평균 등을 구하는 방법을 이해해보자.
  • 그리고 3차원 이상의 데이터가 되면 차원이 어떻게 변하는지 이해하고, 각 차원의 합을 구하는 방법도 정리해보자.

 

1. 2차원 배열에서 sum 함수 사용하기

In [1]:import numpy as np
In [2]:test_array = np.arange(1,13).reshape(3,4) test_array
Out[2]:array([[ 1, 2, 3, 4], 
              [ 5, 6, 7, 8], 
              [ 9, 10, 11, 12]])

In [3]:test_array.sum()
Out[3]:78
  • 1~12까지의 값을 갖는 test_array를 생성한다.
  • 대부분의 라이브러리가 비슷하게 지원하듯 .sum 함수를 사용하면 배열의 전체 요소들의 합을 반환한다.

 

2. 차원별 sum 구하기

In [4]:test_array.sum(axis=0)
Out[4]:array([15, 18, 21, 24])

In [5]:test_array.sum(axis=1)
Out[5]:array([10, 26, 42])
  • 하지만 여러 column의 데이터가 있을 때는 전체 요소를 다 합치는 것은 큰 의미가 없다. 
  • 그렇기 때문에 열 별로 합을 구하거나, 행별로 합을 구해야 하는 경우가 훨씬 자주 있다.
  • 이렇게 하기 위해서는 위와 같이 axis를 지정해주면 된다.
  • axis = 0 이란, 'row들끼리 더해달라'는 것이기 때문에, 열을 고정한 행들의 sum이다
  • 반대로 axis = 1의 경우, 'col들끼리 더해달라'는 의미이기 때문에 행을 고정한 열들의 sum이다.

 

3. 3차원에서의 차원 이해하기 (shape 이해하기)

In [6]:third_order_tensor = np.array([test_array, test_array, test_array]) third_order_tensor
Out[6]:array([[[ 1, 2, 3, 4], 
               [ 5, 6, 7, 8], 
               [ 9, 10, 11, 12]],
               
              [[ 1, 2, 3, 4], 
               [ 5, 6, 7, 8], 
               [ 9, 10, 11, 12]], 
               
              [[ 1, 2, 3, 4], 
               [ 5, 6, 7, 8], 
               [ 9, 10, 11, 12]]])
               
In [7]:third_order_tensor.shape
Out[7]:(3, 3, 4)
  • third_order_tensor라는 변수에 기존의 3x4 array를 3개 붙여보자.
  • 말 그대로 3x4 array가 총 3개 있기 때문에, 새로운 차원이 제일 앞에 추가되고 총개수는 3개인 것이다.
  • 그래서 첫 axis에 3이 추가된다.
  • 새로 추가되는 axis가 axis=0이 되고, 기존의 0,1 axis는 각각 1,2 axis로 밀려나게 된다.
  • 이와 같이 각 차원이 몇번째 axis인지를 볼 수 있어야 한다.

 

4. 변형된 axis로 차원별 sum, mean, std 계산하기

In [8]:third_order_tensor.sum(axis=0)
Out[8]:array([[ 3, 6, 9, 12], 
              [15, 18, 21, 24], 
              [27, 30, 33, 36]])

In [9]:third_order_tensor.sum(axis=1)
Out[9]:array([[15, 18, 21, 24], 
              [15, 18, 21, 24], 
              [15, 18, 21, 24]])

In [10]:third_order_tensor.sum(axis=2)
Out[10]:array([[10, 26, 42], 
               [10, 26, 42], 
               [10, 26, 42]])

In [11]:third_order_tensor.mean(axis=2)
Out[11]:array([[ 2.5, 6.5, 10.5], 
               [ 2.5, 6.5, 10.5], 
               [ 2.5, 6.5, 10.5]])

In [12]:third_order_tensor.std(axis=2)
Out[12]:array([[1.11803399, 1.11803399, 1.11803399], 
               [1.11803399, 1.11803399, 1.11803399], 
               [1.11803399, 1.11803399, 1.11803399]])
  • 2차원과 동일한 개념이지만, axis가 하나가 추가되면서 처음에는 많이 헷갈리는 개념이다. 그만큼 정확하게 이해하고 넘어갈 필요가 있다.
  • axis=0인 경우, 새로 추가된 제일 높은 차원들끼리 더하는 것이다. 즉, test_array들끼리 더해달라는 것이 되기 때문에 sum(axis=0)의 결과값은 기존 test_array의 각각의 값에 3을 곱한 것과 동일하다 (3 = 1+1+1, 6 = 2+2+2 등)
  • axis=1인 경우는 test_array의 axis=0과 동일하기 때문에, test_array의 행들끼리 더하라는 의미이다. 그렇기 때문에 15 = 1+5+9, 18 = 2+6+10, 21 = 3+7+11 등의 순서로 결과값이 나온다.
  • axis=2인 경우는 test_array의 axis=1과 동일하기 때문에, test_array의 열들끼리 더하라는 의미이다. 그렇기 때문에 10 = 1+2+3+4, 26=5+6+7+8, 42=9+10+11+12 등의 결과값이 나오게 된다.
  • 이와 같은 개념으로 mean, std 함수도 사용할 수 있다.

 

5. 마무리

  • 배열 계산을 할 경우 차원을 이해하는 것은 정말 중요하다.
  • 새로 추가되는 차원은 앞의 index로 추가된다는 기본 규칙을 이해하는 것이 중요하다.
  • 그런 차원들중에서 각각 합을 구하고 싶으면 axis parameter를 통해서 전달할 수 있다.
  • 내가 의도한 코드를 잘 짜는 것도 중요하지만, 다른 사람이 짠 코드의 의도를 정확하게 이해하기 위해서는 배열의 차원을 이해하고, 차원별로 합/평균/표준편차를 구했을 때 어떤 의미인지 이해하는 것이 매우 중요하다.
반응형