从满足布尔条件的NumPy数组中获取(列,行)索引

8

我正在使用一个2D NumPy数组。我想要从我的2D数组中满足布尔条件的位置得到(列,行)索引或(x,y)坐标,如果您更喜欢这样的思考方式。

我能通过一个简单的例子来解释我所要做的事情:

>>> 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


请注意,您提供的索引实际上是(y,x)顺序,这也是答案提供的顺序。 - letmaik
2个回答

18

6

除了@Ashwini Chaudhary的答案外,还有一个选择是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在这里是错误的(即使它在文档中提到):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接