【问题标题】:sparse matrix subset to dense matrix稀疏矩阵子集到密集矩阵
【发布时间】:2016-06-25 00:02:41
【问题描述】:

我有一个稀疏矩阵以坐标格式(三元组格式)存储在磁盘上。 我想使用scipy.sparse 将矩阵的块读入内存,但是,这样做时,scipy 将始终假定从0,0 开始的密集矩阵索引,而不管块。 这意味着,例如,对于稀疏矩阵中的最后一个“块”,scipy 将解释为一个巨大的矩阵,它只有右下角的一些值。

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

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

【问题讨论】:

    标签: python matrix scipy sparse-matrix


    【解决方案1】:

    您应该能够在构建子集时调整 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 的子范围,事情可能会变得更复杂。但我认为这抓住了基本思想。

    【讨论】:

    • 谢谢,这是一个好的开始。理想情况下,我想采用我正在努力解决的col 的子范围。坐标可以按row排序,然后是col
    猜你喜欢
    • 2019-09-02
    • 1970-01-01
    • 2014-03-06
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多