我有一个以坐标格式存储在磁盘上的稀疏矩阵(三元组格式)。
我想使用scipy.sparse
将矩阵的块读入内存,但是,在执行此操作时,scipy将始终采用来自0,0
的密集矩阵索引,而不管块是什么。
这意味着,例如,对于最后一个'在稀疏矩阵中,scipy将被解释为一个巨大的矩阵,在右下角只有一些值。
如何正确处理块,以便在执行toarray
创建密集矩阵时,只创建与该块相对应的子集?
这样做的原因是,即使稀疏,矩阵对于内存来说太大(大约6亿32位浮点值)并且在屏幕上显示(因为矩阵代表地理空间栅格)我需要将其转换为密集矩阵以地理空间格式存储(例如geotiff)。
答案 0 :(得分:0)
在构建子集时,您应该能够调整row
和col
值。例如:
In [84]: row=np.arange(10)
In [85]: col=np.random.randint(0,6,row.shape)
In [86]: data=np.ones(row.shape,dtype=int)*2
In [87]: M=sparse.coo_matrix((data,(row,col)),shape=(10,6))
In [88]: M.A
Out[88]:
array([[0, 0, 2, 0, 0, 0],
[0, 0, 0, 0, 0, 2],
[0, 0, 0, 2, 0, 0],
[0, 0, 2, 0, 0, 0],
[0, 0, 2, 0, 0, 0],
[0, 2, 0, 0, 0, 0],
[2, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 2, 0],
[0, 0, 0, 2, 0, 0],
[0, 0, 0, 0, 0, 2]])
要构建包含行子集的矩阵,请使用:
In [89]: M1=sparse.coo_matrix((data[5:],(row[5:]-5,col[5:])),shape=(5,6))
In [90]: M1.A
Out[90]:
array([[0, 2, 0, 0, 0, 0],
[2, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 2, 0],
[0, 0, 0, 2, 0, 0],
[0, 0, 0, 0, 0, 2]])
您必须决定是否要指定M1
的形状,或者让它从row
和col
的范围中推断出来。
如果未对这些坐标进行排序,或者您还希望采用col
的子范围,则事情会变得更加复杂。但我认为这抓住了基本的想法。