哪种格式稀疏稀疏最适合这种类型的矩阵生成和使用?

2024-09-28 19:28:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据文件,它编码关于大型稀疏布尔矩阵的非零元素的信息。这个矩阵没有任何特殊的结构,即它不是对角线或块等。文件的每一行决定一个元素。现在我使用以下循环填充矩阵:

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矩阵更为理想?在

“最优”是指矩阵生成和矩阵行、列块访问的速度,例如向量运算

^{pr2}$

如果记忆比速度更重要,答案会改变吗?在

泰铢


Tags: from元素dataline矩阵scipymatrix速度
1条回答
网友
1楼 · 发布于 2024-09-28 19:28:04

对于像这样的增量添加,dok就可以了。它实际上是一个在元组中存储值的字典:(iRow,iCol)。因此,存储和获取依赖于基本的Python字典效率。在

唯一适合增量添加的是lil,它将数据存储为两个列表列表。在

另一种方法是在3个列表中收集数据,并在最后构建矩阵。首先是coo及其(data,(i,j))输入方法。在

密集的numpy数组是从带有genfromtxtloadtxt的文件加载的。这两种方法都逐行读取文件,收集列表中的值,最后创建数组。在

如果您只读取文件并解析值-而不将任何内容保存到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要快得多。在

^{pr2}$

在更新dok时,一定有一些我没有考虑到的开销。在

我刚刚意识到,我之前曾建议过一次这种update方法:

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

相关问题 更多 >