首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有效地计算出两个矩阵级数的外积?

如何有效地计算出两个矩阵级数的外积?
EN

Stack Overflow用户
提问于 2017-01-26 22:47:07
回答 2查看 441关注 0票数 5

假设我有A(KxMxN)和B(KxLxN)矩阵,其中L,M,N是小的,K是一个大数。我想计算外积,利用最后2维数沿第1维得到矩阵C(KxMxL)。

我可以通过对"K“中的每个索引k运行一个for循环来做到这一点,并对2D矩阵使用numpy的matmul函数

代码语言:javascript
复制
out = [np.matmul(x,y.T) for x, y in zip(A, B)]
out=np.asarray(out)

我想知道,如果没有for循环/理解,我是否可以这样做,因为K是一个非常大的数字。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-26 22:57:08

由于A有shape (K, M, N)B有shape (K, L, N),而且您希望找到与(K, M, L)形状的产品之和,所以可以使用np.einsum

代码语言:javascript
复制
C = np.einsum('kmn,kln->kml', A, B)
票数 5
EN

Stack Overflow用户

发布于 2017-01-26 23:19:25

matmul工作,在B中有一个转置,所以它的第二个最后一个模糊匹配最后一个A

代码语言:javascript
复制
In [1019]: A=np.random.rand(K,M,N)
In [1021]: B=np.random.rand(K,L,N)

In [1023]: C=np.einsum('kmn,kln->kml',A,B)
In [1024]: C.shape
Out[1024]: (2, 4, 3)

In [1026]: D=A@B.transpose(0,2,1)
In [1027]: D.shape
Out[1027]: (2, 4, 3)

In [1028]: np.allclose(C,D)
Out[1028]: True

对于这个小例子,timeit是相同的。

[np.dot(x,y.T) for x, y in zip(A, B)]做了同样的事情:将y的第二个模糊点与x的第二个模糊点匹配,并在AB的第一个dim上迭代。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41884352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档