簡體   English   中英

如何在2D數組上獲得與numpy.where相同的結果,而又沒有從同一行獲取2個索引

[英]How to obtain the same result as numpy.where over a 2D array without getting 2 indices from the same row

我有一個帶有布爾值的numpy數組:

bool_array.shape
Out[84]: (78, 8)

bool_array.dtype
Out[85]: dtype('bool')

我想找到第二維為True的索引:

bool_array[30:35]
Out[87]: 
array([[False, False, False, False,  True, False, False, False],
       [ True, False, False, False,  True, False, False, False],
       [False, False, False, False, False,  True, False, False],
       [ True, False, False, False, False, False, False, False],
       [ True, False, False, False, False, False, False, False]], dtype=bool)

我一直在使用numpy.where來執行此操作,但是有時在第二維上具有True值的索引不止1個。

我想找到一種方法來獲得與numpy.where相同的結果,但要避免在同一行中有2個索引:

np.where(bool_array)[0][30:35]
Out[88]: array([30, 31, 31, 32, 33])

我目前通過遍歷numpy.where的結果來解決此問題,找到哪些n個索引等於n-1,然后使用numpy.delete刪除不需要的索引。

我想知道是否有更直接的方法來獲得所需的結果。

筆記:

  • 我使用的布爾數組的行始終至少具有1個True值。
  • 我不在乎True值是哪個倍數,我只在乎只有1。

IIUC,並且鑒於每行至少有一個TRUE元素,您可以簡單地沿第二個軸使用np.argmax來選擇每行的第一個TRUE元素,如下所示-

col_idx = bool_array.argmax(1)

樣品運行-

In [246]: bool_array
Out[246]: 
array([[ True,  True,  True,  True, False],
       [False, False,  True,  True, False],
       [ True,  True, False, False,  True],
       [ True,  True, False, False,  True]], dtype=bool)

In [247]: np.where(bool_array)[0]
Out[247]: array([0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3])

In [248]: np.where(bool_array)[1]
Out[248]: array([0, 1, 2, 3, 2, 3, 0, 1, 4, 0, 1, 4])

In [249]: bool_array.argmax(1)
Out[249]: array([0, 2, 0, 0])

說明-

對應於np.where(bool_array)[0]輸出的重復項,即:

array([0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3])

,我們需要從np.where(bool_array)[1]的輸出中選擇任何人,即:

array([0, 1, 2, 3, 2, 3, 0, 1, 4, 0, 1, 4])
       ^           ^     ^        ^ 

因此,使用bool_array.argmax(1)從每一行中選擇第一個True會給我們:

array([0, 2, 0, 0])

您可以在結果數組上調用np.unique ,如下所示:

>>> np.where(bool_array)[0][30:35]
Out[4]: array([0, 1, 1, 2, 3, 4])
>>> np.unique(np.where(bool_array)[0][30:35])
Out[5]: array([0, 1, 2, 3, 4])

暫無
暫無

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

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