最快的测试Python矩阵元素方法

2024-04-26 05:15:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个矩阵,其中第(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) 

似乎它仍然是缓慢的过滤和挑选出最大的条纹,虽然,也许我不应该使用这么多的零矩阵


Tags: in元素列表fornpzerosrange成员
1条回答
网友
1楼 · 发布于 2024-04-26 05:15:46

好的,所以我一直到10000个元素(更多的元素开始接近内存限制,这是速度本身的问题),我发现这相当快(在我的机器上不到1秒)

import numpy as np
import time

Cl1 = time.time()
L = np.random.randint(1,100,10000)
nmb = np.size(L)
m = np.zeros(shape = (nmb, nmb))
np.fill_diagonal(m, L)


for i in range(nmb-1):
    j = i+1  
    if np.sum(L[i:j+1])<=np.max(L):
        m[i,j] = np.sum(L[i:j+1])  


Cl2 = time.time()
print(m)
print(Cl2-Cl1)

相关问题 更多 >