Python list.insert()多索引/列表列表
出于性能原因,我想使用pythonlistinsert()方法。我将说明原因: 我的最终列表是一个31k*31k矩阵:Python list.insert()多索引/列表列表,python,numpy,Python,Numpy,出于性能原因,我想使用pythonlistinsert()方法。我将说明原因: 我的最终列表是一个31k*31k矩阵: w=31*10**3 h=31*10**3 distance_matrix = [[0 for x in range(w)] for y in range(h)] 我打算一次更新一次矩阵: for i in range(len(index)): for j in range(len(index)):
w=31*10**3
h=31*10**3
distance_matrix = [[0 for x in range(w)] for y in range(h)]
我打算一次更新一次矩阵:
for i in range(len(index)):
for j in range(len(index)):
distance_matrix[index[i]][index[j]] = k[0][i][j]
显然,这并不好
我希望从一个空列表开始,然后逐步填充,使计算在过程结束时变得密集(并且在开始时变得容易):
但这种多索引或列表插入似乎是不可能的
你建议如何进行?我也研究过numpy阵列,但到目前为止运气不好
准确地说:这里的问题是逐个索引更新(有序的)大型零数组。在数据帧中,我可以使用自定义列/索引,但这在性能上是不可伸缩的
其他信息:
我将整个原始数据矩阵分解成部分,并行计算距离矩阵。此过程中的问题是使用计算值再次聚合距离矩阵。距离矩阵/数组非常大,因此简单的列表插入或编辑需要很长的时间。我认为这种方法实现了我的想法:
distance_matrix = []
def dynamic_append(x,i,j,val):
if((len(x)-1)<i):
dif_x = i-len(x)+1
for k in range(dif_x):
x.append([])
dif_y = j-len(x[i])+1
for l in range(dif_y):
x[i].append([])
elif((len(x[i])-1)<j):
dif_y = j-len(x[i])+1
for l in range(dif_y):
x[i].append([])
x[i][j]=val
return(x)
for i in range(len(index)):
for j in range(len(index)):
distance_matrix=dynamic_append(distance_matrix,index[i],index[j],k[0][i][j])
距离矩阵=[]
定义动态附加(x,i,j,val):
如果((len(x)-1)通常,如果我们迭代地构建一个列表或列表列表,我们使用
list.append
。对于每一行,以[]开头
,向其附加值,然后将其附加到行列表中。什么是k
?它只是另一个列表列表吗?如果是这样,为什么不将其作为一个列表进行索引?k是另一个距离矩阵,也是列表列表,但顺序是关键的。这就是为什么索引列表(索引)的原因用于将其放置在距离矩阵中的适当位置。此矩阵非常大。我认为,使用纯python至少需要20GB内存。你确定你有足够的内存吗?如果你有足够的内存,我认为numpy在这方面帮不了你,因为numpy中的随机访问可能与python列表一样慢。我可以问你在哪种情况下文本你用这段代码吗?也许不需要转换成距离矩阵就可以用numpy对某些部分进行矢量化?这个矩阵适合内存,大约有10**4个单元格。上下文是时间序列的距离矩阵,其中很多。我还考虑过用x,y坐标和值制作一个字典。然后对一个时间序列进行一次性排序但我不知道它是否会表现得更好
distance_matrix = []
def dynamic_append(x,i,j,val):
if((len(x)-1)<i):
dif_x = i-len(x)+1
for k in range(dif_x):
x.append([])
dif_y = j-len(x[i])+1
for l in range(dif_y):
x[i].append([])
elif((len(x[i])-1)<j):
dif_y = j-len(x[i])+1
for l in range(dif_y):
x[i].append([])
x[i][j]=val
return(x)
for i in range(len(index)):
for j in range(len(index)):
distance_matrix=dynamic_append(distance_matrix,index[i],index[j],k[0][i][j])