Python 矢量化分量乘法

Python 矢量化分量乘法,python,numpy,Python,Numpy,将大小为d的2N个向量存储在两个矩阵a和b中,其中a.shape=b.shape=(N,d)(因此a[i]是a中的第i个向量,它包含N个向量,与b相同) 我想以矢量化的方式构造形状(N,d,d)的张量T,使得T[I,p,q]=a[I,p]*b[I,q] 换句话说,我想要一个张量,它的第I个分量是a[I]和b[I]元素的(d乘d)-矩阵,而不做for循环 我试着在多个轴上使用tensordot或dot,但没有效果。有什么想法吗?使用einsum计算会自动写入: np.einsum('ip,iq-&

将大小为d的2N个向量存储在两个矩阵
a
b
中,其中
a.shape=b.shape=(N,d)
(因此
a[i]
a
中的第i个向量,它包含N个向量,与
b
相同)

我想以矢量化的方式构造形状
(N,d,d)
的张量
T
,使得
T[I,p,q]=a[I,p]*b[I,q]

换句话说,我想要一个张量,它的第I个分量是
a[I]
b[I]
元素的(d乘d)-矩阵,而不做for循环


我试着在多个轴上使用tensordot或dot,但没有效果。有什么想法吗?

使用
einsum
计算会自动写入:

np.einsum('ip,iq->ipq', a,b)
这个表达式也清楚地表明,没有求和,只有乘积。这是一种外积,不是内积或矩阵积。在这种情况下,
tensordot
不会有帮助。但广播应:

a[:,:,None] * b[:,None,:]
(有时我必须颠倒
None
的顺序。使用不同的
p
q
来检查它会有帮助。)


您没有提供MCVE来检查我的答案。

使用
einsum
计算会自动写入:

np.einsum('ip,iq->ipq', a,b)
这个表达式也清楚地表明,没有求和,只有乘积。这是一种外积,不是内积或矩阵积。在这种情况下,
tensordot
不会有帮助。但广播应:

a[:,:,None] * b[:,None,:]
(有时我必须颠倒
None
的顺序。使用不同的
p
q
来检查它会有帮助。)


你没有提供一个MCVE来检查我的答案。

a[i]
第i列还是行向量?你能在一个最小的工作示例中发布一些测试数据和失败的
tensordot
dot
操作吗?是
a[i]
第i列或行向量?请您在最简单的工作示例中发布一些测试数据以及失败的
tensordot
dot
操作?非常感谢您简洁明了的回答非常感谢您简洁明了的回答