코딩 연습

(파이썬) numpy.nonzero 본문

Python

(파이썬) numpy.nonzero

코딩아저씨 2017. 3. 25. 06:04
반응형

 

 

numpy  모듈의 nonzero 함수는 요소들 중 0이 아닌 값들의 index 들을 반환해 주는 함수이다. 다음의 예제를 보자.

 

>>> import numpy as np
>>> a=np.array([1, 0, 2, 3, 0])
>>> np.nonzero(a)
(array([0, 2, 3]),)

 

0이 아닌 값 1, 2, 3 의 index 인 0, 2, 3 을 array 형태로 리턴해 주는 것을 볼 수 있다.

그런데 a 가 2D array 가 되면 그 결과를 보기가 좀 복잡해 진다.

 

>>> a=np.array([[1, 0, 7], [8, 1, 0], [1, 0, 0]])
>>> a
array([[1, 0, 7],
       [8, 1, 0],
       [1, 0, 0]])
>>> np.nonzero(a)
(array([0, 0, 1, 1, 2]), array([0, 2, 0, 1, 0]))

 

a 가 행렬 $\left ( \begin{matrix} 1 & 0 & 7\\8 & 1 & 0\\1 & 0 & 0 \end{matrix} \right )$ 와 같은 2D array 가 되면 2개의 array 로 구성된 튜플이 반환되는 것을 볼 수 있다.

이 결과가 무엇을 의미하는지 처음에는 알아보기가 쉽지 않다. 간단히 설명하면 각각의 array 에 index 가 같은 것들끼리 묶으면 2D array 의 0이 아닌 값들이 위치해 있는 index 를 얻을 수 있다. 즉, a 의 요소 중 (0,0), (0, 2), (1, 0), (1, 1), (2, 0) 에 위치한 요소들이 0 이 아닌 값들을 갖고 있다는 것을 보여주는 것이다.

따라서 이 결과를 쉽게 보려면 다음과 같이 결과로 주어진 것을 transpose 시켜주면 된다.

 

>>> np.transpose(np.nonzero(a))
array([[0, 0],
       [0, 2],
       [1, 0],
       [1, 1],
       [2, 0]])

 

그러면 위와 같이 0이 아닌 요소들의 index 를 한 눈에 확인할 수 있게 된다.

마지막으로 0이 아닌 a 의 요소들의 값들을 볼 수 있는 방법도 있다.

 

>>> a[np.nonzero(a)]
array([1, 7, 8, 1, 1])

 

위와 같이 a[np.nonzero(a)] 를 해주면 1행부터 시작하여 0이 아닌 요소들의 값을 차례대로 갖는 array 가 결과로 리턴된다. 

 

np.nonzero 가 꼭 0이 아닌 요소들의 index 만 찾아주는 것은 아니다. 다음과 같이 np.nonzero(조건) 의 형태로 조건을 주면 조건을 참으로 만드는 요소들의 index 가 리턴된다.

>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a > 3
array([[False, False, False],
       [ True,  True,  True],
       [ True,  True,  True]], dtype=bool)
>>> np.nonzero(a > 3)
(array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2]))
>>> np.transpose(np.nonzero(a > 3))
array([[1, 0],
       [1, 1],
       [1, 2],
       [2, 0],
       [2, 1],
       [2, 2]])

또한 다음과 같은 형태로도 조건을 만족시키는 index 들을 얻을 수 있다.

 

>>> (a > 3).nonzero()
(array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2]))

 

 

 

반응형

'Python' 카테고리의 다른 글

(파이썬) numpy.amax  (0) 2017.03.25
(파이썬) numpy.arange  (0) 2017.03.25
(파이썬) Python 내장함수 all  (0) 2017.03.24
(파이썬) functools 모듈의 reduce 함수  (0) 2017.03.23
(파이썬) Python 내장함수 enumerate  (0) 2017.03.22


Comments