优化Scipy稀疏矩阵

时间:2016-04-12 18:44:24

标签: python numpy scipy sparse-matrix

我有一个稀疏矩阵,我目前在每行上枚举,并根据每行的信息执行一些计算。每行完全独立于其他行。但是,对于大型矩阵,此代码非常慢(大约需要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 个答案:

答案 0 :(得分:0)

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

Calculate the euclidean distance in scipy csr matrix

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

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

也许这适用于您的情况。