[SciPy-user] arbitrary submatrices of a sparse matrix?

David Warde-Farley dwf@cs.toronto....
Fri Dec 14 18:21:43 CST 2007

On 14-Dec-07, at 5:21 AM, Robert Cimrman wrote:

> It works for slices only. Yes, the docstring, as I reread it now, is  
> not
> clear. What it should say is, that the slice can be given as:
> 1. slice object
> 2. a tuple (from, to)
> 3. a scalar for single row/column selection
> The method should probably be named _get_submatrix(), as it is used
> internally in __getitem__().

Ah, I figured that out, yes, the tuple is just a start/end point.  I  
ended up using the coo_matrix format and just manually do the element  
selection and reindexing. I've pasted a copy of my code here, so that  
it's in the archives (and so that others may comment and suggest  

I'll also submit a patch of sparse.py that adds a method for this, in  
case the authors think it warrants inclusion.



def coo_submatrix_pull(matr, rows, cols):
     Pulls out an arbitrary i.e. non-contiguous submatrix out of
     a sparse.coo_matrix. This does create a copy, however, which
     is probably not ideal.
     if type(matr) != S.sparse.coo_matrix:
         raise TypeError('Matrix must be sparse COOrdinate format')

     gr = -1 * ones(matr.shape[0])
     gc = -1 * ones(matr.shape[1])

     lr = len(rows)
     lc = len(cols)

     ar = arange(0, lr)
     ac = arange(0, lc)
     gr[rows[ar]] = ar
     gc[cols[ac]] = ac

     newelem = (gr[matr.row] > -1) & (gc[matr.col] > -1)
     newrows = matr.row[newelem]
     newcols = matr.col[newelem]

     return S.sparse.coo_matrix((matr.data[newelem],  
array([gr[newrows], \
         gc[newcols]])),(lr, lc))

More information about the SciPy-user mailing list