Python 将三维矩阵与二维矩阵相乘,返回与二维矩阵具有相同尺寸的矩阵

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]] 我想得到:

在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]]
我想得到:

             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)