将几个矩阵乘以numpy

NNs*_*Nsr 29 python numpy

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

Bi *_*ico 54

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

A.dot(B).dot(C)
Run Code Online (Sandbox Code Playgroud)

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

reduce(numpy.dot, [A1, A2, ..., An])
Run Code Online (Sandbox Code Playgroud)

更新:

这里有关于reduce的更多信息.这是一个可能有帮助的例子.

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

R = A @ B @ C
Run Code Online (Sandbox Code Playgroud)

  • 我一直遇到这个问题,最后写了一个辅助函数.希望这是NumPy的一部分:`def xdot(*args):return reduce(np.dot,args)` (5认同)
  • 在 python3 中,reduce 被移至 functools,“from functools import reduce”。 (4认同)

per*_*iae 22

使用更新恢复旧问题:

截至2014年11月13日,现在有一个np.linalg.multi_dot功能可以完全满足您的需求.它还具有优化呼叫顺序的好处,但在您的情况下这不是必需的.

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

  • 这应该是未来到达这里的任何人的首选答案。 (2认同)
  • @kanso37 我使用 `A_list = [np.random.random(100, 100) for i in range(3)]` 创建了一个数组列表,如上所示,并使用 `%timeit np.linalg.multi_dot(A_list) 运行一个简单的测试)` vs `%timeit A_list[0] @ A_list[1] @ A_list[2]`。似乎第二种方法优于第一种方法(在我的机器上为 100 us vs 85 us),但当然我无法判断这是否普遍正确。我还想知道如何像第一个方法那样递归地使用列表来推广第二种方法。 (2认同)

Flo*_*ker 5

如果您先验地计算所有矩阵,那么您应该使用矩阵链乘法的优化方案。请参阅这篇维基百科文章

  • 谢谢你的评论; 但我认为对于方阵来说这并不重要。正确的? (2认同)