使用numpy.dot()进行矩阵乘法
我想计算一个乘积:
tA*M*B
其中 A 和 B 是两个向量,M 是一个方阵,tA 是 A 的转置。最终的结果应该是一个数字。
Numpy 有一个 dot()
函数,可以用来乘数组和矩阵:有没有办法让我用它一次性计算出我的乘积呢?
我正在使用 Python 2.6。
3 个回答
1
np.einsum
提供了对点乘操作更多的控制。 不过,有人讨论它在什么情况下比 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)
2
你可以使用 reduce 函数
reduce(numpy.dot,[tA,M,B])
这和下面的内容是一样的
numpy.dot(numpy.dot(tA,M),B)
来自 教程
reduce(function, sequence)
会返回一个单一的值,这个值是通过对序列中的前两个元素调用二元函数 function 得到的,然后再用这个结果和下一个元素继续调用,依此类推。
一个容易理解的例子来自 文档,是
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
这样怎么样:
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) )