Python 将矩阵的每个向量乘以三维张量的每个矩阵

Python 将矩阵的每个向量乘以三维张量的每个矩阵,python,arrays,numpy,Python,Arrays,Numpy,我有两个张量m1.shape=[a,b,b]和m2.shape=[a,b]。我要做的是使用循环这样做: ret = np.zeros_like(m2) for idx, (m1_sub, m2_sub) in enumerate(zip(m1, m2)): ret[idx] += m2_sub @ m1_sub 换句话说,将向量m2[i]乘以m1[i],并将结果存储在大小为[a,b]的矩阵中。有没有简单的方法通过使用numpy内置和避免循环来实现这一点?给定m1和m2各自的形状(a,b

我有两个张量
m1.shape=[a,b,b]
m2.shape=[a,b]
。我要做的是使用循环这样做:

ret = np.zeros_like(m2)
for idx, (m1_sub, m2_sub) in enumerate(zip(m1, m2)):
    ret[idx] += m2_sub @ m1_sub

换句话说,将向量m2[i]乘以m1[i],并将结果存储在大小为
[a,b]
的矩阵中。有没有简单的方法通过使用numpy内置和避免循环来实现这一点?

给定
m1
m2
各自的形状
(a,b,b)
(a,b)
您正在这样做

a = 10
b = 5

m1 = np.random.randn(a,b,b)
m2 = np.random.randn(a,b)

ret = np.zeros_like(m2)

for i in range(a):
    ret[i] += (m2[i,:] * m1[i,:,:].T).sum(axis=1)
这和

(m2[...,None] * m1).sum(1)
这可以用

m2
中的第一个轴(
i
下标)与
m1
中的第一个轴相乘

第二个轴根据
sum(轴=1)
减小,这是因为我们在einsum方程的输出中省略了
j
下标


m2
中没有第三个轴,因此它是针对
m1
中的第三个轴(下标
k
)进行广播的。

这与您之前的问题有什么不同?这就成功了,非常感谢您的解释。
np.einsum("ij,ijk->ik", m2, m1)