亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用NumPy查找條件為True的跨度

使用NumPy查找條件為True的跨度

米琪卡哇伊 2021-03-28 15:11:19
假設我有一個numpy數組,我需要找到條件為True的跨度/范圍。例如,我有以下數組,我試圖在其中查找項目大于1的跨度:[0, 0, 0, 2, 2, 0, 2, 2, 2, 0]我需要找到索引(開始,停止):(3, 5) (6, 9)我能夠實現的最快的方法是創建一個布爾數組:truth = data > threshold然后使用numpy.argmin和遍歷數組numpy.argmax以查找開始和結束位置。    pos = 0    truth = container[RATIO,:] > threshold    while pos < len(truth):        start = numpy.argmax(truth[pos:]) + pos + offset        end = numpy.argmin(truth[start:]) + start  + offset        if not truth[start]:#nothing more            break        if start == end:#goes to the end            end = len(truth)        pos = end但這對于我數組中的數十億個位置來說太慢了,而且我發現的跨度通常只是連續幾個位置。有誰知道找到這些跨度的更快方法?
查看完整描述

2 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

怎么樣 首先獲取您擁有的布爾數組:


In [11]: a

Out[11]: array([0, 0, 0, 2, 2, 0, 2, 2, 2, 0])


In [12]: a1 = a > 1

使用以下命令將其向左移動一個(以獲取每個索引的下一個狀態)roll:


In [13]: a1_rshifted = np.roll(a1, 1)


In [14]: starts = a1 & ~a1_rshifted  # it's True but the previous isn't


In [15]: ends = ~a1 & a1_rshifted

如果非零,則是每個True批次的開始(或分別是結束批次):


In [16]: np.nonzero(starts)[0], np.nonzero(ends)[0]

Out[16]: (array([3, 6]), array([5, 9]))

并將它們壓縮在一起:


In [17]: zip(np.nonzero(starts)[0], np.nonzero(ends)[0])

Out[17]: [(3, 5), (6, 9)]


查看完整回答
反對 回復 2021-04-02
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

如果您有權訪問scipy庫:


您可以使用scipy.ndimage.measurements.label標識任何非零值區域。它返回一個數組,其中每個元素的值是原始數組中某個范圍或范圍的ID。


然后,您可以使用scipy.ndimage.measurements.find_objects返回提取這些范圍所需的切片。您可以直接從這些片訪問開始/結束值。


在您的示例中:


from numpy import array

from scipy.ndimage.measurements import label, find_objects


data = numpy.array([0, 0, 0, 2, 2, 0, 2, 2, 2, 0])


labels, number_of_regions = label(a)

ranges = find_objects(labels)


for identified_range in ranges:

    print identified_range[0].start, identified_range[0].stop

您應該看到:


3 5

6 9

希望這可以幫助!


查看完整回答
反對 回復 2021-04-02
  • 2 回答
  • 0 關注
  • 314 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號