稀疏矩阵子集到密集矩阵

时间:2016-03-10 08:46:50

标签: python matrix scipy sparse-matrix

我有一个以坐标格式存储在磁盘上的稀疏矩阵(三元组格式)。 我想使用scipy.sparse将矩阵的块读入内存,但是,在执行此操作时,scipy将始终采用来自0,0的密集矩阵索引,而不管块是什么。 这意味着,例如,对于最后一个'在稀疏矩阵中,scipy将被解释为一个巨大的矩阵,在右下角只有一些值。

如何正确处理块,以便在执行toarray创建密集矩阵时,只创建与该块相对应的子集?

这样做的原因是,即使稀疏,矩阵对于内存来说太大(大约6亿32位浮点值)并且在屏幕上显示(因为矩阵代表地理空间栅格)我需要将其转换为密集矩阵以地理空间格式存储(例如geotiff)。

1 个答案:

答案 0 :(得分:0)

在构建子集时,您应该能够调整rowcol值。例如:

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的形状,或者让它从rowcol的范围中推断出来。

如果未对这些坐标进行排序,或者您还希望采用col的子范围,则事情会变得更加复杂。但我认为这抓住了基本的想法。