从稀疏矩阵的非零值中减去向量

时间:2020-04-05 16:09:40

标签: python scipy sparse-matrix

例如,我想从稀疏矩阵的非零值中减去一个向量。

     [,1] [,2] [,3] [,4]
[1,]    0    0    4    0
[2,]    0    5    0    3
[3,]    1    2    0    0

这是我要减去的向量:

[1 2 3]

所以我最终需要的是:

     [,1] [,2] [,3] [,4]
[1,]    0    0    3    0
[2,]    0    3    0    1
[3,]   -2   -1    0    0

我通过使用sparse_matrix.A来做到这一点,但是当我使用整个数据集时,它正在消耗我的内存。

P.S。矩阵的尺寸太大,我不想使用循环!

1 个答案:

答案 0 :(得分:1)

让我们首先设置问题,然后使用scipy.sparse中的csr_matrix来构建稀疏矩阵:

from scipy.sparse import csr_matrix

a = np.array([[0, 0, 4, 0],
              [0, 5, 0, 3],
              [1, 2, 0, 0]])

a_sp = csr_matrix(a, dtype=np.int8)
b = np.array([1,2,3])

我们可以使用csr_matrix.nonzero找到稀疏矩阵的非零位置,并使用row坐标来索引1d密集数组。然后通过在稀疏矩阵上建立索引,减去相应的nonzero坐标:

nz = a_sp.nonzero()
a_sp[nz] -= b[nz[0]]

print(a_sp.toarray())

array([[ 0,  0,  3,  0],
       [ 0,  3,  0,  1],
       [-2, -1,  0,  0]])