![](/img/trans.png)
[英]numpy.where on 2D array is slower than list comprehensino of numpy.where on 1D array
[英]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刪除不需要的索引。
我想知道是否有更直接的方法來獲得所需的結果。
筆記:
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.