numpy中两个1D向量的点积

时间:2014-04-08 23:11:12

标签: python numpy

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

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

numpy.dot(x,x.T)给出了标量,而不是我想要的2D矩阵。

5 个答案:

答案 0 :(得分:13)

您实际上是在计算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]])

答案 1 :(得分:5)

虽然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

答案 2 :(得分:1)

如果您需要内部产品,请使用numpy.dot(x,x)进行外部产品使用numpy.outer(x,x)

答案 3 :(得分:0)

另一种选择是用户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可以更具可读性。

答案 4 :(得分:0)

另一种方法是定义具有2维的行/列向量,例如

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

array([[1, 2, 3],
   [2, 4, 6],
   [3, 6, 9]])