gpt4 book ai didi

python - 查找 numpy 矩阵中 1 或 0 的最长和最短序列的开始/停止位置和长度

转载 作者:行者123 更新时间:2023-12-01 09:02:52 25 4
gpt4 key购买 nike

我有一个 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.]]

如何获得最长的 1 或 0 序列的长度?另外我如何获得他们的开始和停止位置?

是否有更简单的 numpy 方法来完成此任务?

输出格式很灵活,只要它表示内部列表索引、长度值和值的列表索引即可。

示例:
LONGEST ONES:1, 16, 2, 17(内部列表索引、长度、最长 1s 序列索引开始、最长 1s 序列结束位置)。或 [1, 16, 2, 17]/(1, 16, 2, 17)
最长的零:2, 45, 0, 45

这些问题不是重复的,因为这涉及矩阵:
find the start position of the longest sequence of 1's

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

最佳答案

使用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]

关于python - 查找 numpy 矩阵中 1 或 0 的最长和最短序列的开始/停止位置和长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52323677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com