如何使用python批处理向量乘法
例如,我有一个形状为[1,D]的向量 如果D=4如何使用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维的向量 如何以最有效的方式获得结果
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可以处理这个问题。实际上,这是外部产品,所以你不需要这些。广播可以处理。谢谢兄弟,这正是我需要的。