반응형



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])




반응형

'Python > NumPy' 카테고리의 다른 글

NumPy 강좌 - np.sum 함수에서 axis 의미  (6) 2019.11.07

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


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

  1. 플래쉬 2020.03.23 11:37

    opencv를 파이썬으로 공부하는 학생입니다. 히스토그램을 할 때 calchist 가 아닌 np.sum(img[img.shape[0]//2:,:], axis=0) 를 사용하는 코드를 깃허브에서 봤습니다. 왜 히스토그램에서 np.sum이 필요한지 궁금합니다. 그리고 img[img.shape[0]//2:,:] img는 사진 imread 한 것인데 왜 img 옆에 []이 있는 이유가 무엇인가요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.03.23 12:47 신고

      픽셀의 합을 구한 이유는 이것만 봐서는 알 수 없습니다.

      합을 어떻게 구했는지만 설명한다면


      이미지 img 중 일부의 픽셀을 대상으로 픽셀의 합을 구한것으로 보입니다.



      img[img.shape[0]//2:, :]의 의미는 처리할 픽셀 좌표의 범위입니다.


      Y좌표 범위는 img.shape[0]//2 즉 이미지 높이의 절반 부터 마지막 필셀 위치까지로 했네요.
      예를 들어 10: 이라고 적으면 10부터 끝까지입니다.


      X좌표는 전체 범위를 했네요.
      : 만 적으면 픽셀 전체입니다.



    • 플래쉬 2020.03.23 14:07

      픽셀 하나에 저장되어 있는 정보는 색에 관련된 것인가요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.03.23 15:08 신고

      다음 링크에 있는 영상을 보면 도움이 될듯합니다.

      https://webnautes.tistory.com/1359

    • 플래쉬 2020.03.23 20:29

      감사합니다. 덕분에 수월하게 공부하고 있습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.03.23 20:34 신고

      감사합니다~

+ Recent posts