我得到了两个二维矩阵,其中每个单元都是具有三个元素的向量。
我想做的是使用2D矩阵乘法,当任何一个单元被相乘时,它将采用三元素向量的点积。
如果已经有了答案,我的线性代数技能就缺乏道歉,我浏览了很多与张量点和einsum相关的页面,但我不了解这些内容如何适用于我的情况。
这基本上就是我得到的:
import numpy as np
ar1 = np.array([[[1,2,3],[3,4,5]],[[5,6,7],[7,8,9]]])
ar2 = np.array([[[2,3,4],[4,5,6]],[[6,7,8],[8,9,10]]])
这是我要寻找的东西的方法:
final = [[0 for x in range(2)] for y in range(2)]
final[0][0] = np.dot(ar1[0][0], ar2[0][0]) + np.dot(ar1[0][1], ar2[1][0])
final[0][1] = np.dot(ar1[0][0], ar2[0][1]) + np.dot(ar1[0][1], ar2[1][1])
final[1][0] = np.dot(ar1[1][0], ar2[0][0]) + np.dot(ar1[1][1], ar2[1][0])
final[1][1] = np.dot(ar1[1][0], ar2[0][1]) + np.dot(ar1[1][1], ar2[1][1])
final
Output: [[106, 142], [226, 310]]
实际上,这些矩阵的大小大约为3000x40000x3和40000x40x3,因此非常感谢您考虑速度。谢谢!
答案 0 :(得分:2)
这是使用einsum
np.einsum('ijl,jkl',ar1,ar2)
# array([[106, 142],
# [226, 310]])
和tensordot
np.tensordot(ar1,ar2,((1,2),(0,2)))
# array([[106, 142],
# [226, 310]])
并进行重塑
ar1.reshape(2,-1)@ar2.transpose(0,2,1).reshape(-1,2)
# array([[106, 142],
# [226, 310]])
答案 1 :(得分:1)
A@B
可以得到两个矩阵A和B的矩阵乘积。矩阵乘积仅在最后两个维度执行,因此您必须确保之前的所有维度都相同(或者python可以广播)。因此,A可以是形状(10000,2,3,5),而B可以是形状(10000,2,5,7),而A@B
可以是形状(10000,2,3,7):
final = np.sum(ar2.T@ar1.T,axis=0).T
应该做这项工作。