使用numpy.dot()进行矩阵乘法

0 投票
3 回答
2195 浏览
提问于 2025-04-17 23:20

我想计算一个乘积:

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) )

撰写回答