Scipy sparse matrix multiplication

34,359

Solution 1

You can call the multiply method of csr_matrix to do pointwise multiplication.

sparse.csr_matrix(m).multiply(sparse.csr_matrix(c)).todense()

# matrix([[ 0,  2,  6],
#         [ 0,  5, 12],
#         [ 0,  8, 18]], dtype=int64)

Solution 2

When m and c are numpy arrays, then m * c is not "matrix multiplication". If you think it is then you may be making a mistake. To get matrix multiplication use a matrix class, like numpy's matrix or the scipy.sparse matrix classes.

The reason you are getting the failure is that from the matrix point of view c is a 1x3 matrix:

c = np.matrix([0, 1, 2]) 
c.shape    # (1,3)

c = sp.csc_matrix([0, 1, 2])
c.shape    # (1,3)

If what you want is the matrix multiplication with c then you need to use the transpose.

c = np.matrix([0, 1, 2]).transpose()
c.shape    # (3,1)

m = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
m.shape    # (3,3)

m * c
# matrix([[ 8],
#         [17],
#         [26]])
Share:
34,359
Antonio Simunovic
Author by

Antonio Simunovic

Updated on June 23, 2020

Comments

  • Antonio Simunovic
    Antonio Simunovic almost 4 years

    I have this example of matrix by matrix multiplication using numpy arrays:

    import numpy as np
    m = np.array([[1,2,3],[4,5,6],[7,8,9]])
    c = np.array([0,1,2])
    m * c
    array([[ 0,  2,  6],
           [ 0,  5, 12],
           [ 0,  8, 18]])
    

    How can i do the same thing if m is scipy sparse CSR matrix? This gives dimension mismatch:

    sp.sparse.csr_matrix(m)*sp.sparse.csr_matrix(c)
    
  • Will Martin
    Will Martin almost 6 years
    Nice. Also, you can use the .toarray() if you are wanting a numpy array at the end. I've been burned before when using .todense() which gives a numpy matrix.