优化 Scipy 稀疏矩阵

Posted

技术标签:

【中文标题】优化 Scipy 稀疏矩阵【英文标题】:Optimize Scipy Sparse Matrix 【发布时间】:2016-04-12 18:44:23 【问题描述】:

我有一个稀疏矩阵,我目前正在枚举每一行并根据每一行的信息执行一些计算。每行完全独立于其他行。但是,对于大型矩阵,此代码非常慢(大约需要 2 小时),而且我也无法将矩阵转换为密集矩阵(仅限 8GB RAM)。

import scipy.sparse
import numpy as np

def process_row(a, b):
    """
    a - contains the row indices for a sparse matrix
    b - contains the column indices for a sparse matrix

    Returns a new vector of length(a)
    """

    return

def assess(mat):
    """
    """
    mat_csr = mat.tocsr()
    nrows, ncols = mat_csr.shape
    a = np.arange(ncols, dtype=np.int32)
    b = np.empty(ncols, dtype=np.int32)
    result = []

    for i, row in enumerate(mat_csr):
        # Process one row at a time
        b.fill(i)
        result.append(process_row(b, a))

    return result

if __name__ == '__main__':
    row  = np.array([8,2,7,4])
    col  = np.array([1,3,2,1])
    data = np.array([1,1,1,1])

    mat = scipy.sparse.coo_matrix((data, (row, col)))
    print assess(mat)

我正在寻找是否有任何方法可以更好地设计它以使其执行得更快。本质上,process_row 函数采用 (row, col) 索引对(来自 a, b)并使用另一个稀疏矩阵进行一些数学运算并返回结果。我没有更改此功能的选项,但它实际上可以处理不同的行/列对,并且不限于处理同一行中的所有内容。

【问题讨论】:

【参考方案1】:

您的问题与最近的其他 SO 问题类似:

Calculate the euclidean distance in scipy csr matrix

在我的回答中,我勾勒了一种迭代稀疏矩阵行的方法。我认为将数组转换为lil 并直接从其子列表构造密集行会更快。这避免了为每一行创建一个新的稀疏矩阵的开销。但我没有做过时间测试。

https://***.com/a/36559702/901925

也许这适用于您的情况。

【讨论】:

以上是关于优化 Scipy 稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章

Scipy---6.稀疏矩阵

python中scipy学习——随机稀疏矩阵及操作

将稀疏 scipy 矩阵加载到现有的 numpy 密集矩阵中

Scipy稀疏矩阵维度问题

哪个 SciPy 稀疏矩阵类最适合计算距离矩阵?

Scipy 稀疏矩阵作为 DataFrame 列