如何使用python批处理向量乘法

如何使用python批处理向量乘法,python,numpy,matrix,vector,Python,Numpy,Matrix,Vector,例如,我有一个形状为[1,D]的向量 如果D=4 v = np.array([[1, 2, 3, 4]]) # shape = [1,4] 做 np.dot(v.T,v) 结果将是 Out[80]: array([[ 1, 2, 3, 4], [ 2, 4, 6, 8], [ 3, 6, 9, 12], [ 4, 8, 12, 16]]) 现在我有很多向量,它们的形状是[N,D] 这是N个有D维的向量 如何以最有效的方式获得结果

例如,我有一个形状为[1,D]的向量

如果D=4

v = np.array([[1, 2, 3, 4]]) # shape = [1,4]

np.dot(v.T,v)
结果将是

Out[80]: 
array([[ 1,  2,  3,  4],
       [ 2,  4,  6,  8],
       [ 3,  6,  9, 12],
       [ 4,  8, 12, 16]])
现在我有很多向量,它们的形状是[N,D]

这是N个有D维的向量

如何以最有效的方式获得结果

PS:结果将是一个形状的numpy.ndarray[N,D,D]

In [758]: v = np.array([[1, 2, 3, 4]])
In [759]: v2 = np.vstack([v,v])
In [760]: v2.shape
Out[760]: (2, 4)
In [761]: v2[:,None,:]*v2[:,:,None]
Out[761]: 
array([[[ 1,  2,  3,  4],
        [ 2,  4,  6,  8],
        [ 3,  6,  9, 12],
        [ 4,  8, 12, 16]],

       [[ 1,  2,  3,  4],
        [ 2,  4,  6,  8],
        [ 3,  6,  9, 12],
        [ 4,  8, 12, 16]]])
In [762]: _.shape
Out[762]: (2, 4, 4)
我用广播来构造一个外部产品

对照您的评论示例进行检查

In [763]: x2= np.array([[1, 2], [1, 2]])
In [764]: x2[:,None,:]*x2[:,:,None]
Out[764]: 
array([[[1, 2],
        [2, 4]],

       [[1, 2],
        [2, 4]]])
你想要:

In [765]: np.array([[[1, 2], [2, 4]],[[4, 2],[2, 1]]])
Out[765]: 
array([[[1, 2],
        [2, 4]],

       [[4, 2],
        [2, 1]]])
数字在那里,但第二架飞机翻转了。这真的是你想要的吗?显然,维度的映射方式存在一些模糊性。如果这确实是您想要的,请解释您将如何迭代地执行它


使用
einsum
此外部产品

In [770]: np.einsum('ij,ik->ijk', x2,x2)
Out[770]: 
array([[[1, 2],
        [2, 4]],

       [[1, 2],
        [2, 4]]])

使用
matmul
时,表达式是:
v2[:,:,None]@v2[:,None,:]

你能举例说明
[[1,2],[1,2]]
的输出是什么吗?数组([[1,2],[2,4],[4,2,1]])
np.einsum
np.matmul可以处理这个问题。实际上,这是外部产品,所以你不需要这些。广播可以处理。谢谢兄弟,这正是我需要的。