【发布时间】:2012-08-26 12:01:38
【问题描述】:
假设我有一个 CSR 格式的矩阵,将一行(或多行)设置为零的最有效方法是什么?
以下代码运行很慢:
A = A.tolil()
A[indices, :] = 0
A = A.tocsr()
我不得不转换为scipy.sparse.lil_matrix,因为 CSR 格式似乎既不支持花哨的索引也不支持为切片设置值。
【问题讨论】:
-
好吧,我刚试过
[A.__setitem__((i, j), 0) for i in indices for j in range(A.shape[1])]和SciPy告诉我SparseEfficiencyWarning: changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.... -
不知道 scipy 是否支持它,但由于它是一个 CSR 矩阵,因此可以有效地处理(至少手动)。一个问题是,你想改变稀疏模式,还是那些 0 应该只是数字 0?
-
我不确定稀疏模式是什么意思。我继续使用 scipy.sparse.linalg.spsolve 函数求解方程组。我希望这确定了改变稀疏模式的必要性,或者缺乏。
-
@AshwinSrinath 我发布了一个答案,我猜你可能不关心它。如果您连接到相对较低级别的求解器,它可能可能很有趣,这就像为刚刚修改的每次迭代返回雅可比行列式一样,然后求解器可能期望稀疏模式不会改变。阅读维基百科文章,但我认为您应该更改它(以节省空间和计算)。
标签: row scipy sparse-matrix