Search code examples
pythonnumpyscipysparse-matrixlinear-algebra

Matrix multiplication: maintain scipy.sparse.dok_matrix format


I am trying to use scipy to perform sparse linear algebra calculations in the dok (dictionary of keys) format. When I multiply two matricies together the format changes from dok type to csr format which is an inefficient format for the data and subsequent operations.

How can I keep the dok format?

I have looked at the docs:

But cannot see any information automatic type conversion or if and how it can be avoided.

See this example:

from scipy.sparse import dok_matrix

my_mat = dok_matrix([[1,2], [3,4]])

print(type(my_mat.dot(my_mat)))
print(type(my_mat @ my_mat))

shows that the format has been changed:

<class 'scipy.sparse.csr.csr_matrix'>
<class 'scipy.sparse.csr.csr_matrix'>

Solution

  • Just convert back:

    result = result.todok()
    

    CSR may be an inefficient format for subsequent operations (or maybe not, we can't tell), but it's great for matrix multiplication. Trying to make the matrix multiplication code operate on a DOK result natively would be slower than just converting the result.