簡體   English   中英

從滿足布爾條件的NumPy數組中獲取(列,行)索引

[英]Get (column, row) index from NumPy array that meets a boolean condition

我正在使用2D NumPy數組。 我想得到(列,行)索引,或者(x,y)坐標,如果你更喜歡這樣,我的2D數組符合布爾條件。

我能解釋我想要做的最好的方法是通過一個簡單的例子:

>>> 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東西。

使用numpy.wherenumpy.column_stack

>>> np.column_stack(np.where(b))
array([[1, 2],
       [2, 0],
       [2, 1],
       [2, 2]])

@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM