将几个矩阵乘以numpy

时间:2012-08-07 02:02:55

标签: python numpy

假设你有n个方矩阵A1,...,An。无论如何要以整齐的方式将这些矩阵相乘吗?据我所知,numpy中的dot只接受两个参数。一种显而易见的方法是定义一个函数来调用自身并获得结果。有没有更好的方法来完成它?

5 个答案:

答案 0 :(得分:50)

这可能是一个相对较新的功能,但我喜欢:

A.dot(B).dot(C)

或者如果你有一个长链你可以做:

reduce(numpy.dot, [A1, A2, ..., An])

更新

有关于reduce here.的更多信息以下是一个可能有用的示例。

>>> A = [np.random.random((5, 5)) for i in xrange(4)]
>>> product1 = A[0].dot(A[1]).dot(A[2]).dot(A[3])
>>> product2 = reduce(numpy.dot, A)
>>> numpy.all(product1 == product2)
True

2016年更新: 从python 3.5开始,有一个新的matrix_multiply符号@

R = A @ B @ C

答案 1 :(得分:20)

使用更新恢复旧问题:

November 13, 2014开始,现在有np.linalg.multi_dot函数可以完全按照您的要求执行操作。它还具有优化呼叫顺序的好处,但在您的情况下这不是必需的。

请注意,这可以从numpy版本1.10开始。

答案 2 :(得分:3)

如果您先验地计算所有矩阵,那么您应该使用矩阵链乘法的优化方案。请参阅this Wikipedia article

答案 3 :(得分:2)

A_list = [np.random.randn(100, 100) for i in xrange(10)]
B = np.eye(A_list[0].shape[0])
for A in A_list:
    B = np.dot(B, A)

C = reduce(np.dot, A_list)

assert(B == C)

答案 4 :(得分:1)

另一种实现此目的的方法是使用einsum,它为NumPy实现Einstein summation convention

就这个问题非常简单地解释这个约定:当你把多个矩阵产品写成一大笔产品时,你会得到类似的东西:

P_im = sum_j sum_k sum_l A1_ij A2_jk A3_kl A4_lm

其中P是您的产品的结果,A1A2A3A4是输入矩阵。请注意,您总结了在summand中出现两次的那些索引,即jkl。由于此属性的总和经常出现在物理,矢量微积分以及可能的其他字段中,因此有一个NumPy工具,即einsum

在上面的示例中,您可以使用它来计算矩阵乘积,如下所示:

P = np.einsum( "ij,jk,kl,lm", A1, A2, A3, A4 )

这里,第一个参数告诉函数哪些索引应用于参数矩阵,然后将所有双重出现的索引求和,得到所需的结果。

请注意,计算效率取决于几个因素(因此您最好只测试它):