[SciPy-User] Dot product of two arrays of vectors
Angus McMorland
amcmorl@gmail....
Thu Oct 4 07:53:08 CDT 2012
On 4 October 2012 07:25, Alexander Kalinin <alec.kalinin@gmail.com> wrote:
> Hello, SciPy,
>
> Could you, please, explain me, what is the most standard way in NumPy to
> calculate a dot product of two arrays of vectors, like in MatLab? For
> example, consider two numpy arrays of vectors:
>
> a = np.array([[1, 2, 3], [4, 5, 6]])
> b = np.array([[3, 2, 1], [6, 5, 4]])
>
> For the cross product we have convenient function numpy.cross:
>>>> np.cross(a, b)
> array([[ -4, 8, -4],
> [-10, 20, -10]])
>
> But the numpy.dot product for the arrays of vectors do the matrix
> multiplication:
>>>> np.dot(a, b)
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> ValueError: objects are not aligned
>
> Yes, I can emulate the dot product code like:
>
> np.sum(a * b, axis = 1).reshape(-1, 1)
>
> but may be there is exist more standard way to do the dot product?
>From the docstring of dot:
"For N dimensions it is a sum product over the last axis of `a` and
the second-to-last of `b`::
dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])"
meaning that you want to do
np.dot(a, b.T).
This gives you the dot product of all combinations of vectors (not
just row-wise) between a and b:
array([[10, 28],
[28, 73]]).
You can extract just the row-wise dot products using diag:
In: np.diag(np.dot(a, b.T))
Out: array([10, 73])
which is still faster than the summing and reshaping solution.
In: %timeit np.sum(a * b, axis = 1).reshape(-1, 1)
100000 loops, best of 3: 5.24 us per loop
In: %timeit np.diag(np.dot(a, b.T))
100000 loops, best of 3: 4.21 us per loop
I hope that helps.
Angus
--
AJC McMorland
Post-doctoral research fellow
Neurobiology, University of Pittsburgh
More information about the SciPy-User
mailing list