【问题标题】:how do i do vector multiplication in batch with python [closed]我如何用python批量进行向量乘法[关闭]
【发布时间】:2018-01-23 06:59:07
【问题描述】:

例如,我有一个形状为[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:结果将是一个形状为 [N,D,D] 的 numpy.ndarray

【问题讨论】:

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

标签: python numpy matrix vector


【解决方案1】:
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,:]

【讨论】:

  • 谢谢兄弟,这正是我需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 2014-09-22
  • 2016-10-24
  • 1970-01-01
相关资源
最近更新 更多