Is there a fast way in numpy to add a vector to every row or column of a matrix.
Lately, I have been tiling the vector to the size of the matrix, which can use a lot of memory. For example
mat=np.arange(15)
mat.shape=(5,3)
vec=np.ones(3)
mat+=np.tile(vec, (5,1))
The other way I can think of is using a python loop, but loops are slow:
for i in xrange(len(mat)):
mat[i,:]+=vec
Is there a fast way to do this in numpy without resorting to C extensions?
It would be nice to be able to virtually tile a vector, like a more flexible version of broadcasting. Or to be able to iterate an operation row-wise or column-wise, which you may almost be able to do with some of the ufunc methods.
For adding a 1d array to every row, broadcasting already takes care of things for you:
However more generally you can use
np.newaxisto coerce the array into a broadcastable form. For example:While not necessary for adding the array to every row, this is necessary to do the same for column-wise addition:
EDIT: as Sebastian mentions, for row addition,
mat + vecalready handles the broadcasting correctly. It is also faster than usingnp.newaxis. I’ve edited my original answer to make this clear.