python – numpy matrix vector multiplication
python – numpy matrix vector multiplication
Simplest solution
Use numpy.dot
or a.dot(b)
. See the documentation here.
>>> a = np.array([[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]])
>>> b = np.array([1, 2, 3])
>>> print a.dot(b)
array([16, 6, 8])
This occurs because numpy arrays are not matrices, and the standard operations *, +, , /
work elementwise on arrays.
Note that while you can use numpy.matrix
(as of early 2021) where *
will be treated like standard matrix multiplication, numpy.matrix
is deprecated and may be removed in future releases.. See the note in its documentation (reproduced below):
It is no longer recommended to use this class, even for linear algebra. Instead use regular arrays. The class may be removed in the future.
Thanks @HopeKing.
Other Solutions
Also know there are other options:

As noted below, if using python3.5+ the
@
operator works as youd expect:>>> print(a @ b) array([16, 6, 8])

If you want overkill, you can use
numpy.einsum
. The documentation will give you a flavor for how it works, but honestly, I didnt fully understand how to use it until reading this answer and just playing around with it on my own.>>> np.einsum(ji,i>j, a, b) array([16, 6, 8])

As of mid 2016 (numpy 1.10.1), you can try the experimental
numpy.matmul
, which works likenumpy.dot
with two major exceptions: no scalar multiplication but it works with stacks of matrices.>>> np.matmul(a, b) array([16, 6, 8])

numpy.inner
functions the same way asnumpy.dot
for matrixvector multiplication but behaves differently for matrixmatrix and tensor multiplication (see Wikipedia regarding the differences between the inner product and dot product in general or see this SO answer regarding numpys implementations).>>> np.inner(a, b) array([16, 6, 8]) # Beware using for matrixmatrix multiplication though! >>> b = a.T >>> np.dot(a, b) array([[35, 9, 10], [ 9, 3, 4], [10, 4, 6]]) >>> np.inner(a, b) array([[29, 12, 19], [ 7, 4, 5], [ 8, 5, 6]])
Rarer options for edge cases

If you have tensors (arrays of dimension greater than or equal to one), you can use
numpy.tensordot
with the optional argumentaxes=1
:>>> np.tensordot(a, b, axes=1) array([16, 6, 8])

Dont use
numpy.vdot
if you have a matrix of complex numbers, as the matrix will be flattened to a 1D array, then it will try to find the complex conjugate dot product between your flattened matrix and vector (which will fail due to a size mismatchn*m
vsn
).