从稀疏矩阵的非零值中减去向量
Subtracting a vector from non-zero values of a 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。矩阵维度太大不想用循环!
让我们从设置问题开始,并使用 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
坐标来索引一维密集数组。然后在稀疏矩阵上通过索引在对应的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]])
我想从稀疏矩阵的非零值中减去一个向量,例如
[,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。矩阵维度太大不想用循环!
让我们从设置问题开始,并使用 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
坐标来索引一维密集数组。然后在稀疏矩阵上通过索引在对应的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]])