似乎numpy的einsum
函数不适用于scipy.sparse
矩阵。有其他方法可以执行einsum
对稀疏矩阵可以执行的操作吗?
回应@eickenberg的回答:我想要的特定einsum是numpy.einsum("ki,kj->ij",A,A)
-行的外部乘积之和。
最佳答案
scipy.sparse
矩阵的一个局限性在于它们代表线性运算符,因此保持为二维,这引发了一个问题:您要执行哪个运算?
如果结果不超过二维,那么使用einsum
,einsum
和逐点运算就可以很容易地编写一对2D矩阵上的所有dot
操作,而无需transpose
。
因此,如果您需要对多个稀疏矩阵执行特定操作,则很可能无需einsum
就可以编写它。
更新:实现np.einsum("ki, kj -> ij", A, A)
的特定方法是A.T.dot(A)
。为了说服自己,请尝试以下示例:
import numpy as np
rng = np.random.RandomState(42)
a = rng.randn(3, 3)
b = rng.randn(3, 3)
the_einsum_ab = np.einsum("ki, kj -> ij", a, b)
the_a_transpose_times_b = a.T.dot(b)
# We write a test in order to assert equality
from numpy.testing import assert_array_equal
assert_array_equal(the_einsum_ab, the_a_transpose_times_b) # This passes, so equality
这个结果更一般。现在,如果您使用
b = a
,您将获得特定的结果。关于numpy - 稀疏矩阵上的einsum,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23322866/