我想创建一个矩阵,其中第(I,j)项是某个有序列表L的元素I:j的和,实际上我想停在元素的和超过L的最大成员的地方
例如,如果L = [2,3,5,7]
,矩阵将如下所示:
[ 2, 5, 0, 0 ]
[ 0, 3, 0, 0 ]
[ 0, 0, 5, 0 ]
[ 0, 0, 0, 7 ]
然后我要扫描矩阵,找出列表中与列表中另一个元素相加的连续成员的最大数目,如果这些子列表中有多个子列表,那么我会选择总和最大的子列表。所以在我前面的例子中,最大的数字是2,因为2+5=7,7在列表中。你知道吗
对于非常大的列表,最快的方法是什么?(数百万个元素)。我可以这样做:
m = np.zeros(shape = (nmb, nmb))
for i in range(0, nmb):
m[i, i:] = np.cumsum(L[i:])
print(m)
但我不知道当超过L的最大值时,如何停止累积和。事实上,我只需要矩阵的上三角,或者只需要主对角线和几个上三角对角线,因为累积和超过了L中的最高值,比耗尽矩阵中的列数要早得多。你知道吗
更新:
快一点:
m = np.zeros(shape = (nmb, nmb))
np.fill_diagonal(m, L)
for i in range(0, nmb):
j = i + 1
while 2*m[i,j-1]<L[-1]:
m[i, j] = m[i, j-1] + m[j, j]
j+=1
print(m)
似乎它仍然是缓慢的过滤和挑选出最大的条纹,虽然,也许我不应该使用这么多的零矩阵
好的,所以我一直到10000个元素(更多的元素开始接近内存限制,这是速度本身的问题),我发现这相当快(在我的机器上不到1秒)
相关问题 更多 >
编程相关推荐