计算另一个稀疏矩阵的非零元素处密集矩阵的差异
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()
进行所需的计算
假设 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)
要利用稀疏性,您可以应用分配律,所以
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
我有一个 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()
假设 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)
要利用稀疏性,您可以应用分配律,所以
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