簡體   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