I don't know any established good practices, so here's a pretty straight forward change function for coo_matrix. It converts its argument to coo_matrix, so it will work in other sparse formats (but it returns coo_matrix).
from scipy.sparse import coo_matrix def reshape(a, shape): """Reshape the sparse matrix `a`. Returns a coo_matrix with shape `shape`. """ if not hasattr(shape, '__len__') or len(shape) != 2: raise ValueError('`shape` must be a sequence of two integers') c = a.tocoo() nrows, ncols = c.shape size = nrows * ncols new_size = shape[0] * shape[1] if new_size != size: raise ValueError('total size of new array must be unchanged') flat_indices = ncols * c.row + c.col new_row, new_col = divmod(flat_indices, shape[1]) b = coo_matrix((c.data, (new_row, new_col)), shape=shape) return b
Example:
In [43]: a = coo_matrix([[0,10,0,0],[0,0,0,0],[0,20,30,40]]) In [44]: aA Out[44]: array([[ 0, 10, 0, 0], [ 0, 0, 0, 0], [ 0, 20, 30, 40]]) In [45]: b = reshape(a, (2,6)) In [46]: bA Out[46]: array([[ 0, 10, 0, 0, 0, 0], [ 0, 0, 0, 20, 30, 40]])
Now I'm sure that there are several regular participants who can come up with something better (faster, more memory, less filling ... :)