2016-10-08 194 views
0

構建scipy稀疏矩陣的最佳方法之一是使用coo_matrix方法即。構建大型scipy稀疏矩陣

coo_matrix((data, (i, j)), [shape=(M, N)]) 

where: 
data[:] are the entries of the matrix, in any order 
i[:] are the row indices of the matrix entries 
j[:] are the column indices of the matrix entries 

但是,如果矩陣非常大,將整個i,j和數據向量載入內存是不實際的。

如何構建一個coo_matrix,使得(數據,(i,j))從磁盤進入(使用迭代器或生成器)並且磁盤上的數組/矢量對象使用.npy或pickle格式?

Pickle是更好的選擇,因爲numpy.save/load沒有針對scipy sparse進行優化。也許還有另一種更快的格式。

numpy.genfromtext()和numpy.loadtxt()都是繁瑣,慢速和內存耗盡的問題。

回答

0

我不太明白。如果i, j, data數組太大而無法創建或加載到內存中,那麼它們太大而無法創建稀疏矩陣。

如果這三個數組是有效的,則得到的稀疏矩陣將使用它們作爲相應的屬性,而不需要應對或更改。由coo構成的矩陣可能更緊湊一些,因爲它的indptr數組每行只有一個值。 dataindices陣列的尺寸將與coo(給出或取出重複和排序)的尺寸相同。

doklil格式可用於增量矩陣創建,但它們不會長期保存內存。兩個數據點都必須有一個條目。在lil的情況下,你會有一堆列表;而dok是一個真正的字典。

沒有一種稀疏格式是'虛擬',根據需要'即時'創建元素。

我不明白如何加載3個定義陣列的各種方法有助於如果他們的總大小太大。

In [782]: data=np.ones((10,),int) 
In [783]: rows=np.arange(10) 
In [784]: cols=np.arange(10) 
In [785]: M=sparse.coo_matrix((data,(rows,cols))) 
In [786]: M.data 
Out[786]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) 
In [787]: M.data is data 
Out[787]: True 
In [789]: M.col is cols 
Out[789]: True 

基本上,coo格式是一種存儲這3個數組的方法。真正的工作,所有的數學,總結,甚至索引,都是以csr格式進行的。

+0

使用您的示例創建coo_matrix,內存包含對象data,rows,cols和M.問題是coo_matrix是否可以通過流行,列和數據遞增創建。你的回答表明這是不可能的。 –

+0

'coo_matrix'的'__init__'代碼是用Python編寫的,易於操作。 'bmat'的代碼,從塊中建立一個'coo'矩陣也是有啓發性的。 – hpaulj