我正在尝试计算产品:
TA * M * B
其中A,B是两个向量,M是平方矩阵,tA是转置的A.结果应该是数字。
Numpy有dot()
函数可以将数组和矩阵相乘:有没有办法可以用它来一次性计算我的产品?
我正在使用python 2.6
答案 0 :(得分:2)
怎么样:
import numpy
#Generate Random Data
M = numpy.random.normal(0,1,9).reshape(3,3)
A = numpy.random.normal(0,1,3)
B = numpy.random.normal(0,1,3)
#The Operation
numpy.dot(A, numpy.dot(M,B) )
答案 1 :(得分:2)
您可以使用reduce功能
reduce(numpy.dot,[tA,M,B])
这相当于
numpy.dot(numpy.dot(tA,M),B)
来自tutorial
reduce(function, sequence)
返回通过在序列的前两项上调用二元函数函数构造的单个值,然后在结果和下一项上调用,依此类推。
documentation中一个易于理解的例子是
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
计算((((1+2)+3)+4)+5)
在你的案例中是否值得使用reduce
是值得商榷的。但是,如果您有一长串矩阵乘法,它会澄清代码。比较以下将tA,M1,M2,M3和B相乘的等效代码行。
print numpy.dot(numpy.dot(numpy.dot(numpy.dot(tA,M1),M2),M3),B)
print reduce(numpy.dot,[tA,M1, M2, M3,B])
答案 2 :(得分:1)
np.einsum
可以更好地控制dot
次操作。然而,有一些争论,关于它何时比np.dot
更快或更慢,以及它是否消耗太多内存(当基质非常大时
A=np.arange(1,4)
B=10*np.arange(3,6)
M=np.arange(9).reshape(3,3)
np.dot(A,np.dot(M,B))
np.einsum('i,ij,j',A,M,B)