计算另一个稀疏矩阵的非零元素处密集矩阵的差异

Compute difference of dense matrix at non-zero elements of another sparse matrix

我有一个 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?

我明白了,我们可以使用 W.nonzero()

进行所需的计算

假设 Wcsc_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)

要利用稀疏性,您可以应用分配律,所以

 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