2014-01-28 29 views
8

我正在使用2D NumPy数组。我想从符合布尔条件的二维数组中获得(列,行)索引或(x,y)坐标,如果你喜欢这样想的话。从符合布尔条件的NumPy数组中获取(列,行)索引

我可以解释什么,我试图做的最好办法是通过一个简单的例子:

>>> a = np.arange(9).reshape(3, 3) 
>>> b = a > 4 
>>> b 
>>> array([[False, False, False], 
      [False, False, True], 
      [ True, True, True]], dtype=bool) 

在这一点上我现在有一个布尔数组,标明a > 4

我的目标是抓住索引,其值为True。例如,索引(1, 2),(2, 0),(2, 1)(2, 2)都具有值True。

我的最终目标是与索引列表来结束:

>>> indexes = [(1, 2), (2, 0), (2, 1), (2, 2)] 

我再次强调的是,上面的代码是一个简单的例子了点,但我想要做的应用可以有任意索引a > 4而不是基于arangereshape

+0

注意,你给的指数实际上是(Y,X)订单,这也是什么答案交付。 – letmaik

回答

5

到@Ashwini乔杜里的答案的替代,是numpy.nonzero

>>> a = np.arange(9).reshape(3,3) 
>>> b = a > 4 
>>> np.nonzero(b) 
(array([1, 2, 2, 2]), array([2, 0, 1, 2])) 

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

编辑:什么是速度更快。 nonzerowhere基本上是等效的,但transpose原来是错了这里(即使它是mentioned in the docs):

In [15]: N = 5000 

In [16]: a = np.random.random((N, N)) 

In [17]: %timeit np.nonzero(a > 0.5) 
1 loops, best of 3: 470 ms per loop 

In [18]: %timeit np.transpose(np.nonzero(a > 0.5))  # ooops 
1 loops, best of 3: 2.56 s per loop 

In [19]: %timeit np.where(a > 0.5) 
1 loops, best of 3: 467 ms per loop 

In [20]: %timeit np.column_stack(np.where(a > 0.5)) 
1 loops, best of 3: 653 ms per loop