我有一个类似下面的numpy矩阵:
matrix = [[0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]
如何获取最长序列1s或0s的长度?另外,我将如何获得他们的起止位置?
是否有更简单的numpy方法来完成此任务?
输出格式很灵活,只要它表示内部列表索引,长度值和值的列表索引即可。
示例:
最长的ONES:1, 16, 2, 17
(内部列表的索引,长度,最长1s序列索引开始,最长1s序列结束位置)。
或[1,16,2,17] /(1,16,2,17)
最长的ZEROS:2, 45, 0, 45
这些问题不是重复的,因为这涉及矩阵:
find the start position of the longest sequence of 1's
结果(最长)应在所有列表中考虑。
序列计数到达内部列表的末尾时不会继续。
答案 0 :(得分:1)
使用Divakar's base answer
,您可以通过使用np.vectorize
,设置参数signature
并执行简单的数学运算来获取所需的内容来进行调整。
例如,
m = np.array(matrix)
def get_longest_ones_matrix(b):
idx_pairs = np.where(np.diff(np.hstack(([False], b==1, [False]))))[0].reshape(-1,2)
if not idx_pairs.size: return(np.array([0,0,0]))
d = np.diff(idx_pairs, axis=1).argmax()
start_longest_seq = idx_pairs[d,0]
end_longest_seq = idx_pairs[d,1]
l = end_longest_seq - start_longest_seq
p = start_longest_seq % 45
e = end_longest_seq - 1
return(np.array([l,p,e]))
s = m.shape[-1]
v = np.vectorize(get_longest_ones_matrix, signature=f'(s)->(1)')
x = v(m)
哪个产量
[[ 3 26 28]
[16 2 17]
[ 0 0 0]]
然后
a = x[:,0].argmax()
print(a,x[a])
1 [16 2 17]