在numpy矩阵中找到最长和最短序列1s或0s的开始/停止位置和长度

时间:2018-09-14 01:06:17

标签: python numpy

我有一个类似下面的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

结果(最长)应在所有列表中考虑。
序列计数到达内部列表的末尾时不会继续。

1 个答案:

答案 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]