2011-11-14 6 views
1

2 차원 bool_ 배열에 인덱스 목록을 작성하고 싶습니다.Python Numpy 2 차원 배열 반복

import numpy 
arr = numpy.zeros((6,6), numpy.bool_) 
arr[2,3] = True 
arr[5,1] = True 
results1 = [[(x,y) for (y,cell) in enumerate(arr[x].flat) if cell] for x in xrange(6)] 
results2 = [(x,y) for (y,cell) in enumerate(arr[x].flat) if cell for x in xrange(6)] 

결과 1 :

[[], [], [(2, 3)], [], [], [(5, 1)]] 

결과이 완전히 잘못

목표 :

[(2, 3),(5, 1)] 

나중에 목록을 병합하지 않고이 작업을 수행 할 수있는 방법, 또는 더 나은 방법 일반적으로 이렇게하려면?

답변

1

찾고있는 기능이 numpy.where이라고 생각합니다. 다음 예는 다음과 같습니다

>>> import numpy 
>>> arr = numpy.zeros((6,6), numpy.bool_) 
>>> arr[2,3] = True 
>>> arr[5,1] = True 
>>> numpy.where(arr) 
(array([2, 5]), array([3, 1])) 

당신은 같은 인덱스에 다시이를 설정할 수 있습니다 :

>>> numpy.array(numpy.where(arr)).T 
array([[2, 3], 
     [5, 1]]) 
+0

오 사랑은 들어 본 적이 없습니다. zip (* numpy.where (arr))이 제대로 작동합니다. 다른 사람이 있다면 이걸 잠시 열어두고 듣겠습니다. – user1012037

+1

'np.where()'는 하나의 인자를 가지고'np.nonzero()'와 동일합니다. OP 형식으로 변환하려면 :'np.argwhere (a)'와 같은'np.transpose (np.nonzero (a))'. – jfs

0
>>> import numpy as np 
>>> arr = np.zeros((6,6), np.bool_) 
>>> arr[2,3] = True 
>>> arr[5,1] = True 
>>> np.argwhere(arr) 
array([[2, 3], 
     [5, 1]])