假设您有n个矩阵A1,...,An。无论如何要以一种整洁的方式增加这些矩阵?就我所知,numpy中的点只接受两个参数。一个明显的方法是定义一个函数来调用它自己并获得结果。有没有更好的方法来完成它?在numpy中乘以几个矩阵
回答
这可能是一个相对较新的功能,但我很喜欢:
A.dot(B).dot(C)
,或者如果你有一个长链,你可以这样做:
reduce(numpy.dot, [A1, A2, ..., An])
更新:
还有更多有关减少的信息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年 由于蟒蛇3.5的,有一个新的matrix_multiply符号,@
:
R = A @ B @ C
如果您先计算所有矩阵,那么您应该使用矩阵链乘法的优化方案。见this Wikipedia article。
感谢您的评论;但我不认为它是重要的矩阵。对? – NNsr 2012-08-07 02:35:59
@Nikandish:正确。我错过了原来答案中的那部分内容。 – 2012-08-08 14:57:05
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)
复活与更新一个老问题:
现在有一个np.linalg.multi_dot
功能,它正是你想要的。它还具有优化呼叫订单的优点,但在您的情况下这不是必需的。
请注意,这可从numpy版本1.10开始。
实现此目的的另一种方法是使用einsum
,它为NumPy实现Einstein summation convention。
非常简单解释一下这个公约就这一问题:当你写下你的多重矩阵产品作为产品之一之大,你喜欢的东西:
P_im = sum_j sum_k sum_l A1_ij A2_jk A3_kl A4_lm
其中P
的结果是你的产品和A1
,A2
,A3
和A4
是输入矩阵。请注意,您总结的是加数中出现两次的索引,即j
,k
和l
。由于这个属性的总和常常出现在物理学,矢量演算以及其他一些领域,所以它有一个NumPy工具,即einsum
。
在上面的例子中,你可以用它来计算你的矩阵产品如下:
P = np.einsum("ij,jk,kl,lm", A1, A2, A3, A4)
这里,第一个参数告诉该指数适用于参数矩阵,然后将所有倍加出现指数函数总结,产生所需的结果。
注意的是,计算效率取决于几个因素(所以你可能是最好关闭只测试它):
- 1. 在numpy中乘以三维矩阵
- 2. 如何乘numpy矩阵乘numpy数组?
- 3. Python numpy矩阵乘以一个对角矩阵
- 4. Numpy:矩阵乘以3D张量 - 建议
- 5. 矩阵乘数组与Numpy
- 6. Numpy高效矩阵乘法
- 7. Python numpy memmap矩阵乘法
- 8. 几何矩阵乘法
- 9. Python矩阵乘法; numpy的阵列
- 10. Numpy 3D阵列矩阵乘法函数
- 11. 2D矩阵的numpy的矩阵乘法,得到三维矩阵
- 12. 使用numpy在一系列点上乘以一个矩阵?
- 13. 在Java中乘以两个矩阵
- 14. 在R中乘以两个矩阵
- 15. 在R中乘以两个矩阵
- 16. 在Julia中乘以两个矩阵
- 17. 在高维Python Numpy矩阵乘法
- 18. 在单元阵列中乘以矩阵
- 19. 在C++中将矩阵乘以另一个矩阵
- 20. 乘以矩阵C++
- 21. 矩阵乘以组
- 22. 乘以逆矩阵?
- 23. 相乘以矩阵
- 24. numpy的阵列和矩阵乘法 - 返回矩阵
- 25. 矩阵(scipy稀疏) - 矩阵(密集; numpy阵列)乘法效率
- 26. Matlab - 将矩阵乘以3D矩阵的每个矩阵
- 27. 为什么不能用NumPy乘以一个2,2矩阵?
- 28. LDL的Numpy阵列乘法对称矩阵的分解乘法
- 29. 矩阵乘法tensorflow与numpy的区别
- 30. Numpy matrix乘积 - 稀疏矩阵
感谢您的回复。第一个选项正常工作;但第二个没有;或者至少我不能让它工作。你能否详细说明一下,或者举个例子?非常感谢 – NNsr 2012-08-07 05:41:45
我一直遇到这个问题,最后写了一个辅助函数。希望这是NumPy的一部分:'def xdot(* args):return reduce(np.dot,args)' – rd11 2014-07-03 09:57:01
只需在A,B和C的类型为numpy.ndarray时添加此注释。这可能适用于其他类型,但我没有检查。 – OfLettersAndNumbers 2017-12-12 23:37:22