我有一个稀疏矩阵,我目前在每行上枚举,并根据每行的信息执行一些计算。每行完全独立于其他行。但是,对于大型矩阵,此代码非常慢(大约需要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)并使用另一个稀疏矩阵进行一些数学运算并返回结果。我没有选择更改此功能,但它实际上可以处理不同的行/列对,并且不限于处理同一行中的所有内容。
答案 0 :(得分:0)
您的问题与最近的其他问题类似:
Calculate the euclidean distance in scipy csr matrix
在我的回答中,我描绘了一种迭代稀疏矩阵行的方法。我认为将数组转换为lil
更快,并直接从其子列表构造密集行。这避免了为每行创建新的稀疏矩阵的开销。但我还没有做过时间测试。
https://stackoverflow.com/a/36559702/901925
也许这适用于您的情况。