Making a full matrix defeats the purpose of working with sparse data, right? How about:

```
    a, ja, ia, shape = csr
    smat = {}
    for r in range(len(ia) - 1):
        slc = slice(ia[r], ia[r + 1])
        for v, c in zip(a[slc], ja[slc]):
            smat[(r, c)] = v
    return SparseMatrix(*(shape + [smat]))
```