# Multiplying elements in a sparse array with rows in matrix

If you have a sparse matrix X:

``````>> X = csr_matrix([[0,2,0,2],[0,2,0,1]])
>> print type(X)
>> print X.todense()
<class 'scipy.sparse.csr.csr_matrix'>
[[0 2 0 2]
[0 2 0 1]]
``````

And a matrix Y:

``````>> print type(Y)
>> print text_scores
<class 'numpy.matrixlib.defmatrix.matrix'>
[
]
``````

…How can you multiply each element of X by the rows of Y. For example:

``````[[0*8 2*8 0*8 2*8]
[0*5 2*5 0*5 1*5]]
``````

or:

``````[[0 16 0 16]
[0 10 0 5]]
``````

I’ve tired this but obviously it doesn’t work as the dimensions dont match:
`Z = X.data * Y`

Unfortunatly the `.multiply` method of the CSR matrix seems to densify the matrix if the other one is dense. So this would be one way avoiding that:

``````# Assuming that Y is 1D, might need to do Y = Y.A.ravel() or such...

# just to make the point that this works only with CSR:
if not isinstance(X, scipy.sparse.csr_matrix):
raise ValueError('Matrix must be CSR.')

Z = X.copy()
# simply repeat each value in Y by the number of nnz elements in each row:
Z.data *= Y.repeat(np.diff(Z.indptr))
``````

This does create some temporaries, but at least its fully vectorized, and it does not densify the sparse matrix.

For a COO matrix the equivalent is:

``````Z.data *= Y[Z.row] # you can use np.take which is faster then indexing.
``````

For a CSC matrix the equivalent would be:

``Z.data *= Y[Z.indices]``