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)