![](/img/trans.png)
[英]Fastest way to create a symmetric matrix in python, with elements as below
[英]Fastest way to test matrix elements in 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 + 5 = 7和7在列表中,因此最高的数字将为2。
对于超大型列表,最快的方法是什么? (数百万个元素)。 我可以做类似的事情:
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)
似乎仍然很难过滤并挑选出最大的条纹,也许我不应该使用这么多零的矩阵
好的,直到我达到10,000个元素为止(越来越多的元素开始逼近内存限制,这本身就是速度的问题),我发现它相当快(在我的机器上不到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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.