2017-08-17 33 views
2

這是一個itertools解決方案,它返回每個連續塊的長度列表。這裏一個連續的塊是在1之間沒有間斷的運行。有沒有辦法讓itertools返回與每個塊關聯的索引?獲取NumPy數組中連續的匹配數及其第一個/最後一個索引的數量

import itertools 
import numpy as np 

stack = np.zeros((10,10)) 
stack[0] = 1 
stack[5,:5] = 1 
contiguous_hits = [ (sum(1 for _ in group)) for row in stack for key, group in itertools.groupby(row) if key ] 

非常感謝!

+0

爲什麼'總和(1 _組))'?爲什麼不只是「總和(組)」? –

+0

我認爲最初我使用True/False值而不是整數 – Fosa

+0

好吧。那麼你只計算連續的? –

回答

2

這裏有一個量化的方法 -

def start_stop_per_row(stack): 
    z = np.zeros((stack.shape[0],1),dtype=stack.dtype) 
    z_ext = np.column_stack((z,stack,z)) 
    mask = z_ext[:,1:] != z_ext[:,:-1] 
    idx = np.argwhere(mask) 
    return pd.DataFrame({'row':idx[::2,0],'start':idx[::2,1],'stop':idx[1::2,1]-1}) 

採樣運行 -

In [108]: stack 
Out[108]: 
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 1, 1, 1, 1, 0, 0, 1, 1, 1], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [1, 1, 1, 1, 1, 0, 0, 0, 0, 0]]) 

In [109]: start_stop_per_row(stack) 
Out[109]: 
    row start stop 
0 0  0  9 
1 2  1  4 
2 2  7  9 
3 5  0  4 
相關問題