【问题标题】:dot product of two 1D vectors in numpynumpy中两个一维向量的点积
【发布时间】:2017-07-16 02:17:20
【问题描述】:

我正在使用python 中的numpy 来计算向量乘法。 我有一个维度为 n x 1 的向量 x,我想计算 x*x_transpose。 这给我带来了问题,因为x.Tx.transpose() 不会影响一维向量(numpy 以相同的方式表示垂直和水平向量)。

但是如何在numpy 中计算 (n x 1) x (1 x n) 向量乘法?

numpy.dot(x,x.T) 给出一个标量,而不是我想要的二维矩阵。

【问题讨论】:

  • @ᴋᴇʏsᴇʀ 它确实给出了一个矩阵
  • @cdhagmann Y. 我注意到了尺寸
  • 一个 (1xN) 矩阵乘以一个 (Nx1) 矩阵应该得到一个标量。但是不应该将 (Nx1) 矩阵与 (1xN) 矩阵相乘。
  • 您的数组不是 1xN 或 Nx1,而是一维的。如果你想要 2-dim 数组,请使用 2-dim 数组。

标签: python numpy


【解决方案1】:

您实际上是在计算Outer Product

您可以使用np.outer

In [15]: a=[1,2,3]

In [16]: np.outer(a,a)
Out[16]:
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])

【讨论】:

  • 10分钟结束后我会接受这个
【解决方案2】:

虽然np.outer 是执行此操作的最简单方法,但我想我只想提一下您可以如何操纵(N,) 形状的数组来执行此操作:

In [17]: a = np.arange(4)
In [18]: np.dot(a[:,None], a[None,:])
Out[18]:
array([[0, 0, 0, 0],
       [0, 1, 2, 3],
       [0, 2, 4, 6],
       [0, 3, 6, 9]])

In [19]: np.outer(a,a)
Out[19]:
array([[0, 0, 0, 0],
       [0, 1, 2, 3],
       [0, 2, 4, 6],
       [0, 3, 6, 9]])

您也可以将None 替换为np.newaxis

另一种更奇特的方法是使用np.einsum

In [20]: np.einsum('i,j', a, a)
Out[20]:
array([[0, 0, 0, 0],
       [0, 1, 2, 3],
       [0, 2, 4, 6],
       [0, 3, 6, 9]])

只是为了好玩,一些时间可能会因硬件和 numpy 版本/编译而异:

小型向量

In [36]: a = np.arange(5, dtype=np.float64)

In [37]: %timeit np.outer(a,a)
100000 loops, best of 3: 17.7 µs per loop

In [38]: %timeit np.dot(a[:,None],a[None,:])
100000 loops, best of 3: 11 µs per loop

In [39]: %timeit np.einsum('i,j', a, a)
1 loops, best of 3: 11.9 µs per loop

In [40]: %timeit a[:, None] * a
100000 loops, best of 3: 9.68 µs per loop

还有一些更大的东西

In [42]: a = np.arange(500, dtype=np.float64)

In [43]: %timeit np.outer(a,a)
1000 loops, best of 3: 605 µs per loop

In [44]: %timeit np.dot(a[:,None],a[None,:])
1000 loops, best of 3: 1.29 ms per loop

In [45]: %timeit np.einsum('i,j', a, a)
1000 loops, best of 3: 359 µs per loop

In [46]: %timeit a[:, None] * a
1000 loops, best of 3: 597 µs per loop

【讨论】:

  • 别忘了a[:,None] * a
【解决方案3】:

如果您想要内积,请使用 numpy.dot(x,x) 外积使用 numpy.outer(x,x)

【讨论】:

    【解决方案4】:

    另一种选择是用二维定义行/列向量,例如

    a = np.array([1, 2, 3], ndmin=2)
    np.dot(a.T, a)
    
    array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])
    

    【讨论】:

      【解决方案5】:

      另一种选择是用户numpy.matrix

      >>> a = np.matrix([1,2,3])
      >>> a
      matrix([[1, 2, 3]])
      >>> a.T * a
      matrix([[1, 2, 3],
              [2, 4, 6],
              [3, 6, 9]])
      

      一般首选numpy.arrays。但是,对于长表达式,使用 numpy.matrices 可能更具可读性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-27
        • 2016-05-15
        • 2017-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多