2013-09-23 87 views
2

權SciPy的稀疏矩陣格式在我的代碼我目前迭代和創建三個列表:什麼是增量總和

data, row, col

還有就是(row, col)對高重複,在我最後的稀疏矩陣M我希望M[row, col]的值爲data中所有對應元素的總和。從閱讀文檔看,coo_matrix格式看起來很完美,對於小例子來說,它工作得很好。

我遇到的問題是,當我擴大我的問題大小時,看起來中間列表data, row, col正在使用我所有的(8GB)內存和交換空間,並且我的腳本被自動殺死。

所以我的問題是:

是否有適當的格式或逐步建設我總結矩陣的有效途徑,所以我沒有保存完整的中間列表/ numpy的陣列?

我的程序循環通過的網格,在每個點創建local_data, local_row, local_col列表,該列表中的元素,然後附加到data, row, col,所以能夠與列表更新稀疏矩陣按稀疏矩陣構造將是理想的情況。

回答

3

有兩件事可能會讓你失望:數組上的重複項或列表開銷。在任何一種情況下,可能正確的做法是在將您的列表轉儲到coo_matrix並將其添加到您的總數之前,將您的列表擴大到如此之大。我花了幾個定時:

rows = list(np.random.randint(100, size=(10000,))) 
cols = list(np.random.randint(100, size=(10000,))) 
values = list(np.random.rand(10000)) 

%timeit sps.coo_matrix((values, (rows, cols))) 
100 loops, best of 3: 4.03 ms per loop 

%timeit (sps.coo_matrix((values[:5000], (rows[:5000], cols[:5000]))) + 
     sps.coo_matrix((values[5000:], (rows[5000:], cols[5000:])))) 
100 loops, best of 3: 5.24 ms per loop 

%timeit sps.coo_matrix((values[:5000], (rows[:5000], cols[:5000]))) 
100 loops, best of 3: 2.16 ms per loop 

因此,有關於兩種分裂的列表,每個轉換爲coo_matrix,然後將它們放在一起有25%的開銷。如果你做更多的分裂,它似乎並沒有那麼糟糕:

%timeit (sps.coo_matrix((values[:2500], (rows[:2500], cols[:2500]))) + 
     sps.coo_matrix((values[2500:5000], (rows[2500:5000], cols[2500:5000]))) + 
     sps.coo_matrix((values[5000:7500], (rows[5000:7500], cols[5000:7500]))) + 
     sps.coo_matrix((values[7500:], (rows[7500:], cols[7500:])))) 
100 loops, best of 3: 5.76 ms per loop 
+0

海梅 - 再次感謝。我現在正在使用「增長列表這麼大」的方法,並且(至少這部分)我的代碼在合理的時間內運行而不會崩潰。 – YXD