파이썬 numpy 질문 있어요

조회수 457회
>>> import numpy as np
>>> g = np.arange(1,10).reshape(3,3)
>>> g
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> g[1, 2]
6
>>> g[2]
array([7, 8, 9])
>>> g[[0,0],[2,0]]
array([3, 1])

여기서 g[1, 2] 과 g[2] 은 왜 저 결과가 나오는지 이해했는데

g[[0,0],[2,0]] 의 답이 왜 array([3, 1]인지 이해를 못 하겠습니다 ㅠㅠ

array([1,7]) 이라고 생각했는데 이 생각이 잘못된 이유도 같이 알려주시면 감사할 것 같습니다...

2 답변

  • 저도 잘 아는 것은 아니지만 행렬 계산 하는 방법과 비슷하게 생각하시면 될 듯 합니다.

    // 왼쪽 첫 번째 행 (0), 오른쪽 첫 번째 열 (2)
    // 왼쪽 두 번째 행 (0), 오른쪽 두 번째 열 (0)
    g[[0,0], [2,0]] = g[[0x2], [0x0]] 
    

    이렇게 생각 하면 출력은 첫 번째 원소가 0 행 (편의 상 표현) 2열, 두 번째 원소가 0행 0열이 되겠네요...

    즉, array(3, 1) 이 됩니다...

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 행렬 계산하는 방식으로 하면 된다고 교수님께서 알려주셨었는데 까먹고 있다가 답변 보고 덕분에 다시 떠올렸습니다! 감사합니다 :) 알 수 없는 사용자 2019.10.22 23:37
  • 아마 g[0,0]과 g[2,0]의 값을 얻고 싶으셨던 것 같습니다. 저도 nupmy를 잘은 몰라서 해당 값을 얻는 방법에 대해서는 도움을 드리기 어려울 것 같지만, 위의 값이 어떻게 나온 것인지에 대해서는 제가 테스트해본 것을 바탕으로 설명드리겠습니다.

    직접 테스트를 해 보시면 아시겠지만 g[0]과 g[[0]]은 다른 값이에요

    >>> g[0]
    array([1,2,3])
    >>> g[[0]]
    array([[1,2,3]])
    

    첫번째 경우는 array의 element가 1,2,3인 것이고, 두번째 경우는 array 안의 첫번째 element로 [1,2,3]의 array 자체를 갖고 있습니다.

    따라서 g[0,0]과 g[[0,0]]의 실행 결과 역시 아래와 같이 나타납니다.

    
    >>> g[0,0]
    1
    >>> g[[0,0]]
    array([[1,2,3],
           [1,2,3]])
    

    첫 번째 경우는 (0,0) 위치에 있는 element를 반환하는 것이라면 두 번째 경우는 (0) 위치에 있는 element([1,2,3])을 각각의 element로 갖고 있는 array를 반환합니다.

    또, g[0,2]와 g[[0],[2]]를 실행해보면 다음과 같은 결과가 나타납니다

    >>> g[0,2]
    3
    >>> g[[0],[2]]
    array([3])
    

    첫 번째와 두 번째 경우 모두 3을 반환하지만, 하나는 숫자 자체이고 다른 하나는 배열을 반환하고 있습니다. 조금 생각해보면, 두 번째 경우는 g[0]의 반환값인 [1,2,3]에 대해 세 번째 값인 3을 array로 반환하고 있다는 것을 알 수 있습니다.

    위의 내용들을 종합해보면 다음과 같습니다.

    g[[0,0],[2,0]]에서 [0,0] 부분은 g[0]과 g[0]을 element로 갖는 array를 의미합니다. [2,0]은 위의 array에서 첫 번째 array의 세 번째 element와 두 번째 array의 첫 번째 element를 의미합니다.

    따라서 이를 실행해보면 다음과 같습니다.

    >>> g[[0,0],[2,0]]
    array([3,1])
    

    실제로 이런 용법으로 사용하는지는 모르겠지만 위 내용을 종합해보면, numpy 2차원 배열 기준으로 첫 번째 element에 array가 들어가면 해당 array의 element에 해당하는 행 자체를 array의 element로 반환하고, 두 번째 element에 array가 들어가면 각 element를 앞에서 반환한 array들 중 자신과 동일한 위치의 element에 해당하는 array의 index로 사용한다고 할 수 있습니다.

    말주변이 없어서 복잡하게 설명을 드렸는데, 이해하시는데 도움이 되실지는 모르겠네요.

    여담이지만, 원하시는 값을 얻으시려면 다음과 같이 실행하는 방법도 있습니다.

    >>> g[[0,2],[0,0]]
    array([1,7])
    

    다만 제가 설명드린 부분은 왜 저런 값이 나오는가에 대한 부분이고, 이런 방식으로 사용하는 방법 외에 다른 좋은 방법이 있을 수도 있으니 numpy에 대해 더 공부해 보시는 것을 추천드립니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)