scipy 计算稠密矩阵在另一稀疏矩阵的非零元素处的差

xhv8bpkk  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(137)

我有一个n x n矩阵W,一个n维向量U和一个标量p > 1。我想计算W * (np.abs(U[:,np.newaxis] - U)**p),其中***abs是按元素方式理解的(如在numpy中)。
现在的问题是U[:,np.newaxis] - U不适合内存,但是,W是一个稀疏矩阵(scipy.sparse),所以我实际上不必计算U[:,np.newaxis] - U的所有元素,而只需要计算那些W不为零的元素。
如何才能在计算时间和内存方面最有效地计算W * (np.abs(U[:,np.newaxis] - U)**p),理想情况下只进行稀疏运算,而不需要单步执行numpy

camsedfj

camsedfj1#

为了利用稀疏性,你可以这样应用分配定律:

C = W * (np.abs(U[:,np.newaxis] - U)**p)

将导致

rtW = W**(1/p)
C = (rtW * np.abs(U[:,np.newaxis] - rtW * U)**p

注意,只有当W的项不为负时,这才有意义。

rtW = np.abs(W)**(1/p)
signW = np.sign(W)
C = signW * (rtW * np.abs(U[:,np.newaxis] - rtW * U)**p
mwkjh3gx

mwkjh3gx2#

我想出来了,我们可以使用W.nonzero()来执行所需的计算
假设W是一个csc_matrix

nonzero = W.nonzero()
values = np.abs(U[nonzero[0]] - U[nonzero[1]])**p
A = sparse.csc_matrix((values, nonzero), shape=(U.size, U.size))
W.multiply(A)

相关问题