我正在使用Python,Numpy和Scipy包进行矩阵计算。我试图执行计算X.transpose() * W * X
,其中X是2x3密集矩阵,W是稀疏对角矩阵。 (下面非常简化的例子)
import numpy
import scipy.sparse as sp
X = numpy.array([[1, 1, 1],[2, 2, 2]])
W = sp.spdiags([1, 2], [0], 2, 2).tocsr()
我需要找到密集矩阵X.transpose和稀疏矩阵W的乘积。
我知道scipy中的一种方法不接受右侧的稀疏矩阵。
>>> sp.csr_matrix.dot(X.transpose(), W)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method dot() must be called with csr_matrix instance as first argument (got ndarray instance instead)
有没有办法将稀疏和密集矩阵相乘,其中稀疏矩阵是scipy右边的术语?如果没有,那么在不将W变成密集矩阵的情况下,最好的方法是什么?
答案 0 :(得分:1)
矩阵乘法是关联的,因此您始终可以先计算W * X
:
>>> X.T.dot(W.dot(X))
array([[9, 9, 9],
[9, 9, 9],
[9, 9, 9]])
如果你真的需要计算X.T * W
,第一个密集,第二个稀疏,你可以让稀疏矩阵__mul__
方法为你处理它:
>>> X.T * W
array([[1, 4],
[1, 4],
[1, 4]])
实际上,对于您的用例,如果您使用np.matrix
而非np.array
,则您的特定操作会变得非常巧妙地代码:
>>> Y = np.matrix(X)
>>> Y.T * W * Y
matrix([[9, 9, 9],
[9, 9, 9],
[9, 9, 9]])