似乎numpy的einsum函数不适用于scipy.sparse矩阵。有其他方法可以执行einsum对稀疏矩阵可以执行的操作吗?

回应@eickenberg的回答:我想要的特定einsum是numpy.einsum("ki,kj->ij",A,A)-行的外部乘积之和。

最佳答案

scipy.sparse矩阵的一个局限性在于它们代表线性运算符,因此保持为二维,这引发了一个问题:您要执行哪个运算?

如果结果不超过二维,那么使用einsumeinsum和逐点运算就可以很容易地编写一对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/

10-11 08:21