반응형



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




반응형

해본 것을 문서화하여 기록합니다.
부족함이 있지만 도움이 되었으면 합니다.


포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.


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

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">
  1. thumbnail
    플래쉬
    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 옆에 []이 있는 이유가 무엇인가요?

    • thumbnail
      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좌표는 전체 범위를 했네요.
      : 만 적으면 픽셀 전체입니다.



    • thumbnail
      플래쉬
      2020.03.23 14:07

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

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

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

      https://webnautes.tistory.com/1359

    • thumbnail
      플래쉬
      2020.03.23 20:29

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

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

      감사합니다~