优化 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 稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章