반응형



NumPy 함수를 사용하다보면 axis 아규먼트를 사용하는 것이 있습니다. 


어떤 의미일까 고민해보다가 적어봅니다. 



최초 작성 2019. 11. 7




넘파이 모듈을 임포트 하고 크기 2 x 3 x 4인 넘파이 배열에 0~23까지 숫자를 채웁니다.  


>>> import numpy as np
>>> a = np.arange(24).reshape(2,3,4)




변수 a를 출력해보면 다음처럼 배열이 출력됩니다. 

바깥쪽 괄호 [] 부터 시작하여 괄호를 기준으로 차원이 2, 3, 4가 됩니다. 



가장 바깥쪽 괄호안에 2개의 원소가 존재하며


>>> a
array([[[ 0,  1, 2, 3],
        [ 4, 5,  6, 7],
        [ 8, 9, 10, 11]],

      [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])




중간 괄호 안에는 3개의 원소가 존재하고 


>>> a
array([[[ 0,  1, 2,  3],
        [ 4,  5, 6,  7],
        [ 8,  9, 10, 11]],

      [[12, 13, 14, 15],
        [16, 17, 18, 19],
       [20, 21, 22, 23]]])




가장 안쪽 괄호안에는 4개의 원소가 존재한다는 의미입니다. 


>>> a
array([[[ 0,  123],
        [ 4567],
        [ 89, 10, 11]],

      [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])




axis를 명시하지 않으면 배열에 속하는 모든 원소에 대한 합을 구합니다. 


>>> np.sum(a)
276




axis=0이면 첫번째 괄호가 사라졌을 때 남은 2차원 원소가 하나로 더해집니다.

2차원 배열의 대응하는 원소끼리 더하면 됩니다. 


      [[ 0,  1, 2, 3],
        [ 4, 5,  6, 7],
        [ 8, 9, 10, 11]],

      [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]


>>> np.sum(a, axis=0)
array([[12, 14, 16, 18],
      [20, 22, 24, 26],
      [28, 30, 32, 34]])




axis=1이면 두번째 괄호가 사라지면서 남는 1차원 원소가 하나로 더해집니다. 

예제에선 위에 3개의 1차원 배열의 대응하는 원소끼리 더해서 하나의 1차원 배열이 되고 

아래에 3개의 1차원 배열의 대응하는 원소끼리 더해서 하나의 1차원 배열이 됩니다. 


>>> a
      [ [ 0,  1, 2,  3],
        [ 4,  5, 6,  7],
        [ 8,  9, 10, 11],

        [12, 13, 14, 15],
        [16, 17, 18, 19],
       [20, 21, 22, 23]  ])


>>> np.sum(a, axis=1)
array([[12, 15, 18, 21],
      [48, 51, 54, 57]])




axis=2이면 3번째 괄호가 사라지면서 남는 스칼라 원소가 하나로 더해집니다. 

예를 들어 0, 1, 2, 3이 모두 더해져서 6이되고  4, 5, 6, 7이 더해져 22가되고 8, 9, 10, 11이 더해져 38이 됩니다. 


>>> a
array([[  0,  123 ,
          4567 ,
          89, 10, 11 ],

      [ 12, 13, 14, 15 ,
        16, 17, 18, 19 ,
        20, 21, 22, 23 ]])


>>> np.sum(a, axis=2)
array([[ 6, 22, 38],
      [54, 70, 86]])




axis=(0,1)이면 첫번째, 두번째 괄호가 사라지면서 남는 1차원 배열의 대응하는 원소끼리 더해집니다. 

예를 들어 0, 4, 8, 12, 16, 20을 더해서 60이 됩니다. 


        [ 0,  123]
        [ 4567]
        [ 89, 10, 11]

        [12, 13, 14, 15]
        [16, 17, 18, 19]
        [20, 21, 22, 23]


>>> np.sum(a, axis=(0,1))
array([60, 66, 72, 78])




axis = (1,2)이면 두번째, 세번째 괄호가 사라지면서 남는 스칼라가 모두 더해집니다. 

아래 예에서 노란색 숫자들이 모두 더해져서 66이 되며

초록색 숫자들이 모두 더해져서 210이 됩니다. 


      [ 0,  1, 2,  3,
        4, 5, 6,  7,
        8, 9, 10, 11,

      12, 13, 14, 15,
      16, 17, 18, 19,
      20, 21, 22, 23,])



>>> np.sum(a, axis=(1,2))
array([ 66, 210])




문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts