我希望能够将稀疏矩阵的行通过数组中的标量进行划分。
例如,我有一个 csr_matrix
C
:
C = [[2,4,6], [5,10,15]]
D = [2,5]
我希望在除法后得到
C
的结果为:result = [[1, 2, 3], [1, 2, 3]]
我已经尝试使用我们用于numpy
数组的方法:
result = C / D[:,None]
但这种方法似乎非常缓慢。如何在稀疏矩阵中高效地实现呢?
我希望能够将稀疏矩阵的行通过数组中的标量进行划分。
例如,我有一个 csr_matrix
C
:
C = [[2,4,6], [5,10,15]]
D = [2,5]
C
的结果为:result = [[1, 2, 3], [1, 2, 3]]
我已经尝试使用我们用于numpy
数组的方法:
result = C / D[:,None]
方法 #1
这里有一个使用手动复制和索引的稀疏矩阵解决方案 -
from scipy.sparse import csr_matrix
r,c = C.nonzero()
rD_sp = csr_matrix(((1.0/D)[r], (r,c)), shape=(C.shape))
out = C.multiply(rD_sp)
与使用C / D [:, None]
创建完整矩阵的输出不同,此方法的输出也是一个稀疏矩阵。因此,该方法可以节省内存。
通过使用np.repeat
进行复制而不是索引可能会提高性能 -
val = np.repeat(1.0/D, C.getnnz(axis=1))
rD_sp = csr_matrix((val, (r,c)), shape=(C.shape))
方法二
另一种方法可以涉及到稀疏矩阵的data
方法,它为我们提供了一个扁平化的视图,以便在原地
得到结果,并且避免使用nonzero
,如下所示 -
val = np.repeat(D, C.getnnz(axis=1))
C.data /= val
第二种方法
怎么样? - DivakarrD_sp = csr_matrix(((1.0/D)[c], (r,c)), shape=(C.shape))
- Bhavulc = csr_matrix(C) c2 = c.multiply( 1/np.array(D).reshape(2,1) ) c2.toarray() '输出结果:' array([[ 2, 4, 6], [ 5, 10, 15]], dtype=int64)
C = [[2,4,6], [5,10,15]] D = [2,5]
from scipy.sparse import csr_matrix
D
转换为numpy.matrix
类型(我假设您可以这样做,除非D
太大而无法放入内存),那么您只需运行C.multiply(1.0 / D.T)
得到你想要的。
一行代码:result = [[C[i][j]/D[i] for j in range(len(C[0]))] for i in range(len(D))]
C = [[2,4,6], [5,10,15]] #len(C[0]) = 3
D = [2,5] # len(D) = 2
result = [[C[i][j]/D[i] for j in range(len(C[0]))] for i in range(len(D))]
print result