简体   繁体   中英

dot product of two 1D vectors in numpy

I'm working with numpy in python to calculate a vector multiplication. I have a vector x of dimensions nx 1 and I want to calculate x*x_transpose. This gives me problems because xT or x.transpose() doesn't affect a 1 dimensional vector ( numpy represents vertical and horizontal vectors the same way).

But how do I calculate a (nx 1) x (1 xn) vector multiplication in numpy ?

numpy.dot(x,xT) gives a scalar, not a 2D matrix as I want.

You are essentially computing an Outer Product .

You can use 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]])

While np.outer is the simplest way to do this, I'd thought I'd just mention how you might manipulate the (N,) shaped array to do this:

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]])

Where you could alternatively replace None with np.newaxis .

Another more exotic way to do this is with 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]])

And just for fun, some timings, which are likely going to vary based on hardware and numpy version/compilation:

Small-ish vector

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

And something a little larger

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

如果需要内部产品,则将numpy.dot(x,x)用于外部产品,请使用numpy.outer(x,x)

Another alternative is to user 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]])

Generally use of numpy.arrays is preferred. However, using numpy.matrices can be more readable for long expressions.

Another alternative is to define the row / column vector with 2-dimensions, eg

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM