【发布时间】:2019-08-28 13:59:45
【问题描述】:
我有一个稀疏的 CSC 矩阵“A”,我想用一个全为零的向量替换其中的第一行,但第一个条目是 1 除外。
到目前为止,我正在做低效的版本,例如:
import numpy as np
from scipy.sparse import csc_matrix
row = np.array([0, 2, 2, 0, 1, 2])
col = np.array([0, 0, 1, 2, 2, 2])
data = np.array([1, 2, 3, 4, 5, 6])
A = csc_matrix((data, (row, col)), shape=(3, 3))
replace = np.zeros(3)
replace[0] = 1
A[0,:] = replace
A.eliminate_zeros()
但我想用 .indptr、.data 等来做。因为它是 CSC,我猜这也可能效率低下?在我的确切问题中,矩阵是 66000 X 66000。
对于 CSR 稀疏矩阵,我已经看到它完成了
A.data[1:A.indptr[1]] = 0
A.data[0] = 1.0
A.indices[0] = 0
A.eliminate_zeros()
所以,基本上我想对 CSC 稀疏矩阵做同样的事情。
预期结果:与上述完全相同,只是效率更高(适用于非常大的稀疏矩阵)。
即从:开始
[1, 0, 4],
[0, 0, 5],
[2, 3, 6]
并将上面的行替换为与矩阵一样长的向量,除开头的 1 外全为零。因此,应该以
结尾[1, 0, 0],
[0, 0, 5],
[2, 3, 6]
并且能够有效地处理大型稀疏 CSC 矩阵。
提前致谢:-)
【问题讨论】:
-
我不确定直接使用
indptr会比使用A[0,:]=更快。创建密集的replace足够高效。需要记住的是,csc索引不会从稀疏结构中删除新的 0。这需要一个单独的“删除零”方法调用。 -
即使在尺寸更大的情况下? IE。 66000 x 66000
标签: python numpy scipy sparse-matrix