我有一个数据文件,它编码关于大型稀疏布尔矩阵的非零元素的信息。这个矩阵没有任何特殊的结构,即它不是对角线或块等。文件的每一行决定一个元素。现在我使用以下循环填充矩阵:
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}$如果记忆比速度更重要,答案会改变吗?在
泰铢
对于像这样的增量添加,
dok
就可以了。它实际上是一个在元组中存储值的字典:(iRow,iCol)
。因此,存储和获取依赖于基本的Python字典效率。在唯一适合增量添加的是
lil
,它将数据存储为两个列表列表。在另一种方法是在3个列表中收集数据,并在最后构建矩阵。首先是
coo
及其(data,(i,j))
输入方法。在密集的
numpy
数组是从带有genfromtxt
或loadtxt
的文件加载的。这两种方法都逐行读取文件,收集列表中的值,最后创建数组。在如果您只读取文件并解析值-而不将任何内容保存到
dok
中,那么速度如何?这会让你知道将数据添加到矩阵中实际花费了多少时间。在另一种可能性是将值直接存储到通用字典中,并使用它创建
dok
。在这比直接更新
^{pr2}$dok
要快得多。在在更新
dok
时,一定有一些我没有考虑到的开销。在我刚刚意识到,我之前曾建议过一次这种
update
方法:https://stackoverflow.com/a/27771335/901925
Why are lil_matrix and dok_matrix so slow compared to common dict of dicts?
相关问题 更多 >
编程相关推荐