[英]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))
輸入法。
從具有genfromtxt
或loadtxt
的文件中加載密集的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.