Python 将三维矩阵与二维矩阵相乘,返回与二维矩阵具有相同尺寸的矩阵
在Numpy中,假设我有一个维数为I x j x k的矩阵a和一个维数为k x I的矩阵B。如何在不使用循环的情况下取回尺寸为k x I的产品?Python 将三维矩阵与二维矩阵相乘,返回与二维矩阵具有相同尺寸的矩阵,python,numpy,matrix,vectorization,Python,Numpy,Matrix,Vectorization,在Numpy中,假设我有一个维数为I x j x k的矩阵a和一个维数为k x I的矩阵B。如何在不使用循环的情况下取回尺寸为k x I的产品? 例如: Let A = [[[1 2], [3 4]], [[5 6], [7 8]]] B = [[a b], [c d]] 我想得到:
例如:
Let A = [[[1 2],
[3 4]],
[[5 6],
[7 8]]]
B = [[a b],
[c d]]
我想得到:
C = [[a+2c 5b+6d],
[3a+4c 7b+8d]]
我目前的解决办法是
np.diagonal(np.dot(A, B), axis1=0, axis2=2)
但是,问题是我使用的是一个大数据集(a
和B
的维度很大),因此np.dot(a,B)
会导致内存错误。因此,我想找出一个更好的方法来解决这个问题,而不用计算点积
我已经研究过像einsum
和tensordot
这样的函数,但是我没有找到我需要的(或者可能遗漏了什么)。如果有人能帮我,我将不胜感激。谢谢大家! 您可以通过分析输入和输出维度来实现这一点
A.shape -> i, j, k
B.shape -> k, i
您的示例不是很好,但如果仔细查看您要求的输出,则B
的形状必须与A
的第一个和最后一个维度相匹配
总和减少沿A
的最后一个轴和B
的第一个轴进行:
np.einsum('ijk,ki->ji', A, B)
einsum
可能会让人感到害怕,但进行这种分析可以避免因反复试验而造成的许多挫折。查看您的输出,C[:,0]
是
A[0] @ B[0].T
同样地,C[:,1]
是A[1]@B[1].T
考虑到这一点,np.einsum
公式是:
C = np.einsum('ijk,ik->ji', A,B)
显示triedJ必须在输出形状中显示的内容。请给出一个不是2x2的示例,以了解原因。np.diagonal(np.dot(A,B),axis1=0,axis2=2)
似乎没有给出预期的输出。检查B=[[1,2],[3,4]]
,预期输出为[[5,39],[11,53]
。比你快30秒:)@madpysicast haha,但你的公式不同:-)。我讨厌这样的例子。你确定B
是ik
而不是ki
吗?我知道,对。而且没有来自OP的尝试。我总是半诱惑地立即关闭。pfff。比我快:(np.einsum('ijk,ki->ji',A,B)