How to elementwise-multiply a scipy.sparse matrix by a broadcasted dense 1d array?
I replied over at scipy.org as well, but I thought I should add an answer here, in case others find this page when searching.
You can turn the vector into a sparse diagonal matrix and then use matrix multiplication (with *) to do the same thing as broadcasting, but efficiently.
>>> d = ssp.lil_matrix((3,3))>>> d.setdiag(np.ones(3)*3)>>> a*d<5x3 sparse matrix of type '<type 'numpy.float64'>' with 2 stored elements in Compressed Sparse Row format>>>> (a*d).todense()matrix([[ 0., 0., 0.], [ 0., 0., -3.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 6., 0.]])
Hope that helps!
I think A.multiply(B) should work in scipy sparse. The method multiply does "point-wise" multiplication, not matrix multiplication.
HTH
Well, here's a simple code that will do what you want. I don't know if it is as efficient as you would like, so take it or leave it:
import scipy.sparse as sspdef pointmult(a,b): x = a.copy() for i in xrange(a.shape[0]): if x.data[i]: for j in xrange(len(x.data[i])): x.data[i] *= b[x.rows[i]] return x
It only works with lil matrices so you'll have to make some changes if you want it to work with other formats.