Python 矢量化分量乘法
将大小为d的2N个向量存储在两个矩阵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-&
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
操作?非常感谢您简洁明了的回答非常感谢您简洁明了的回答