1 回答

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
這是一個(gè) numpy 解決方案,它避免了基于上一個(gè)問題的顯式循環(huán)。
我假設(shè)布爾數(shù)組名為a. 本質(zhì)上,我們找到行從 0 到 1 或從 1 到 0 變化的索引,并查看它們之間的差異。通過在前后填充 0,我們確保對(duì)于從 0 到 1 的每個(gè)轉(zhuǎn)換,還有另一個(gè)從 1 到 0 的轉(zhuǎn)換。
為了方便我處理a,并a.T在同一時(shí)間,但你可以分開,如果你想要做他們。
m,n = a.shape
A = np.zeros((2*m,n+2))
A[:m,1:-1] = a
A[m:,1:-1] = a.T
dA = np.diff(A)
start = np.where(dA>0)
end = np.where(dA<0)
argmax_run = np.argmax(end[1]-start[1])
row = start[0][argmax_run]
col_start = start[1][argmax_run]
col_end= end[1][argmax_run]-1
max_len = col_end - col_start + 1
print('max run of length {}'.format(max_len))
print('in '+('row' if row<m else'col')+' {}'.format(row%m)+' from '+('col' if row<m else'row')+' {} to {}'.format(col_start,col_end))
為了提高性能和存儲(chǔ),我們可以更改A為布爾數(shù)組。由于-1和1在dA上面總是成對(duì)出現(xiàn),我們可以找到start和end如下。
nz = np.nonzero(dA)
start = (nz[0][::2], nz[1][::2])
end = (nz[0][1::2], nz[1][1::2])
請(qǐng)注意,您可以然后完全刪除變量start,end因?yàn)樗鼈儾⒉皇钦嬲枰摹?/p>
添加回答
舉報(bào)