[英]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.