簡體   English   中英

哪種scipy.sparse格式最適合這種類型的矩陣生成和使用?

[英]Which format of scipy.sparse is best for this type of matrix generation and use?

我有一個數據文件,該文件編碼有關大型稀疏布爾矩陣的非零元素的信息。 該矩陣沒有任何特定的結構,即它不是對角線或塊等。文件的每一行都確定一個元素。 現在,我使用以下循環填充矩陣:

from scipy.sparse import dok_matrix

nRows = 30000
nCols = 600000

data = dok_matrix((nRows,nCols), dtype=np.int8)

with open('input.txt','r') as fraw:
    for line in fraw:
        ## Figure out iRow and iCol to set to 1 from line
        data[iRow,iCol] = 1

這是可行的,但是非常慢。 是否有其他類型的scipy.sparse矩陣更理想?

“最佳”表示矩陣生成以及訪問矩陣的行和列塊的速度,例如矢量運算,例如

someRows = data[rowIndex1:rowIndex2,]
someColumns = data[,colIndex1:colIndex2]

如果記憶比速度更重要,答案是否會改變?

謝謝

對於像這樣的增量添加, dok就可以了。 它實際上是一個將值存儲在元組的字典: (iRow,iCol) 因此,存儲和獲取取決於Python的基本教學效率。

唯一適合增量添加的是lil ,它將數據存儲為2個列表列表。

另一種方法是收集3個列表中的數據,並在最后構造矩陣。 首先是coo及其(data,(i,j))輸入法。

從具有genfromtxtloadtxt的文件中加載密集的numpy數組。 兩者都逐行讀取文件,收集列表列表中的值,最后創建數組。

如果僅讀取文件並解析值-而沒有將任何內容保存到dok如何? 這樣可以使您了解將數據添加到矩陣實際花費了多少時間。


另一個可能性是將值直接存儲到通用字典中,並使用它來創建dok

In [60]: adict=dict()

In [61]: for i in np.random.randint(1000,size=(2000,)):
    adict[(i,i)]=1
   ....:     

In [62]: dd=sparse.dok_matrix((1000,1000),dtype=np.int8)

In [63]: dd.update(adict)

In [64]: dd.A
Out[64]: 
array([[1, 0, 0, ..., 0, 0, 0],
       [0, 1, 0, ..., 0, 0, 0],
       [0, 0, 1, ..., 0, 0, 0],
       ..., 
       [0, 0, 0, ..., 1, 0, 0],
       [0, 0, 0, ..., 0, 1, 0],
       [0, 0, 0, ..., 0, 0, 1]], dtype=int8)

這比直接更新dok

In [66]: %%timeit 
for i in np.random.randint(1000,size=(2000,)):
    adict[(i,i)]=1
dd.update(adict)
   ....: 
1000 loops, best of 3: 1.32 ms per loop

In [67]: %%timeit 
for i in np.random.randint(1000,size=(2000,)):
    dd[i,i]=1
   ....: 
10 loops, best of 3: 35.6 ms per loop

我沒有考慮到更新dok必須有一些開銷。

我只是意識到我建議過一次這種update方法:

https://stackoverflow.com/a/27771335/901925 Why are lil_matrix and dok_matrix so slow compared to common dict of dicts?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM