首页 文章

稀疏矩阵子集到密集矩阵

提问于
浏览
0

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

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

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

1 回答

  • 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 的子范围,事情可能会变得更加复杂 . 但我认为这 grab 了基本的想法 .

相关问题