1 回答
TA贡献1776条经验 获得超12个赞
这是一个 numpy 解决方案,它避免了基于上一个问题的显式循环。
我假设布尔数组名为a. 本质上,我们找到行从 0 到 1 或从 1 到 0 变化的索引,并查看它们之间的差异。通过在前后填充 0,我们确保对于从 0 到 1 的每个转换,还有另一个从 1 到 0 的转换。
为了方便我处理a,并a.T在同一时间,但你可以分开,如果你想要做他们。
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))
为了提高性能和存储,我们可以更改A为布尔数组。由于-1和1在dA上面总是成对出现,我们可以找到start和end如下。
nz = np.nonzero(dA)
start = (nz[0][::2], nz[1][::2])
end = (nz[0][1::2], nz[1][1::2])
请注意,您可以然后完全删除变量start,end因为它们并不是真正需要的。
添加回答
举报