2011-11-14 112 views
1

想將索引列表構建到2維bool_數組中,其中True。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是完全錯誤的

目標:

[(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.transpose(np.nonzero(a))',相當於'np.argwhere(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]])