繁体   English   中英

加速代码以过滤python中的矩阵

[英]Speeding up a code to filter a matrix in python

我有[[row1],[row2]等]的对称矩阵d1,我想从中删除一些元素。 我要删除的元素的索引在列表ind中指示(例如,ind = [1,2,3]表示我要删除d1 [1] [1],d1 [2] [2]和d1 [3 ] [3])。

我编写了以下代码,将过滤后的矩阵d1写入d2。 但是,它需要永远运行。 有什么办法可以加快代码的速度吗?

 for k in range(len(d1)):
     if k not in ind:
         d2.append([])
         for j in range(len(d1)):
             if j not in ind:
                 d2[-1].append(d1[k][j])

 print(d2)
 return d2

例:

d1 = [[1, 2, 3,6,8],[4,5,6,6,6],[7,8,9,6,6],[1, 2, 3,6,6],[1, 2, 3,6,9]]

ind = [0,3]

d2 = [[5,6,6],[8,9,6],[2, 3,9]]

我建议从简单的优化开始:

good_indices = set(range(len(d1))) - set(ind)

for k in good_indices:
    d2.append([])
    for j in good_indices:
        d2[-1].append(d1[k][j])

print(d2)
return d2

主要问题可能是,如果ind是一个非常长的列表(成千上万个条目),则比每次if x not in ind时都要执行的列表都要长,您必须检查整个列表 仅将ind更改为set可能会大大加快速度。 另外,您不必创建两个循环中的条件,而只需创建一个要保留的良好索引列表。 最后,使它成为列表理解器可能会使它的速度进一步提高并提高可读性。

ind_set = set(ind)
retain = [i for i in range(len(d1)) if i not in ind_set]
d2 = [[d1[k][j] for j in retain] for k in retain]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM