posted by cimple 2016. 3. 29. 17:26

Numpy 에 nonzero 라는 function 이 있다.


http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.nonzero.html#numpy.nonzero


document 를 봐도 헷갈리는 함수인데, non-zero 인 element 에 대하여 2D array 형태로 리턴하는 함수이다.


예를 들어

import numpy
arr = numpy.array([[1,0],[2,3]])
arr.nonzero()

이런 식으로 사용했을 때, 다음과 같은 결과를 얻게 될 것이다.

--> (array([0, 1, 1]), array([0, 0, 1]))

이 결과물이 낯설게 느껴질 수 있는데, input 으로 주어진 행렬에서 nonzero element 의 'index' 를 행과열을 각각 적은 것이다.


다시 말해서, input 으로 주어진 행렬(numpy array) 는 다음과 같다.


| 1   0 |

| 2   3 |


여기에서 0이 아닌 element 들의 행렬 index 는 다음과 같을 것이다. 행, 열의 성분을 보기 쉽도록 다른 색으로 표현했다.


(0,0), (1,0), (1,1)


numpy.nonzero 함수는 저 index 들에서 행은 행대로, 열은 열대로 따로 묶어서 리턴해주는 것이다. 


(0, 1, 1)

(0, 0, 1)


왜 이런 식으로 리턴하는가 하면, ([0,1,1], [0,0,1]) 형태의 튜플로 원래 array 에서 곧바로 element 를 뽑아올 수 있기 때문이다.


다시 말하면 위의 예제에서

arr[arr.nonzero()]
--> array([1, 2, 3])

이런 식으로 non-zero element 를 직접 접근할 수 있고, 이는

arr[[0,1,1],[0,0,1]]

로 직접 입력해 보면 같은 결과를 얻을 수 있음을 확인할 수 있을 것이다.





Numpy 의 where() 함수도 마찬가지이다.


http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.where.html


where() 함수는 condition 만 주어지면 condition 을 만족시키는 element 의 index 를 반환하는데, 이 때 반환하는 형식이 nonzero 함수와 동일하다.