[Scipy-svn] r3623 - in trunk/scipy/sparse: . tests

scipy-svn at scipy.org scipy-svn at scipy.org
Sat Dec 8 16:06:53 EST 2007


Author: wnbell
Date: 2007-12-08 15:06:07 -0600 (Sat, 08 Dec 2007)
New Revision: 3623

Modified:
   trunk/scipy/sparse/sparse.py
   trunk/scipy/sparse/tests/test_sparse.py
Log:
improved lil_matrix.tocsr()
added construction benchmark


Modified: trunk/scipy/sparse/sparse.py
===================================================================
--- trunk/scipy/sparse/sparse.py	2007-12-08 17:31:07 UTC (rev 3622)
+++ trunk/scipy/sparse/sparse.py	2007-12-08 21:06:07 UTC (rev 3623)
@@ -18,7 +18,7 @@
                   ndarray, amax, amin, rank, conj, searchsorted, ndarray,   \
                   less, where, greater, array, transpose, empty, ones, \
                   arange, shape, intc, clip, prod, unravel_index, hstack, \
-                  array_split
+                  array_split, concatenate, cumsum
 
 import numpy
 from scipy.sparse.sparsetools import csrtodense, \
@@ -1922,6 +1922,10 @@
         else:
             raise TypeError, "need a dense vector"
 
+#    def tocoo(self):
+#        """ Return a copy of this matrix in COOrdinate format"""
+
+
     def tocsr(self, nzmax=None):
         """ Return Compressed Sparse Row format arrays for this matrix
         """
@@ -2538,21 +2542,24 @@
     def tocsr(self):
         """ Return Compressed Sparse Row format arrays for this matrix.
         """
-        nnz = self.getnnz()
-        data = zeros(nnz, dtype=self.dtype)
-        colind = zeros(nnz, dtype=intc)
-        row_ptr = empty(self.shape[0]+1, dtype=intc)
-        row_ptr[:] = nnz
-        k = 0
-        for i, row in enumerate(self.rows):
-            data[k : k+len(row)] = self.data[i]
-            colind[k : k+len(row)] = self.rows[i]
-            row_ptr[i] = k
-            k += len(row)
+        
+        indptr = asarray([len(x) for x in self.rows], dtype=intc)
+        indptr = concatenate( ( array([0],dtype=intc), cumsum(indptr) ) )
+        
+        nnz = indptr[-1]
+        
+        indices = []
+        for x in self.rows:
+            indices.extend(x)
+        indices = asarray(indices,dtype=intc)
 
-        row_ptr[-1] = nnz           # last row number + 1
-        return csr_matrix((data, colind, row_ptr), dims=self.shape)
+        data = []
+        for x in self.data:
+            data.extend(x)
+        data = asarray(data,dtype=self.dtype)
 
+        return csr_matrix((data, indices, indptr), dims=self.shape)
+
     def tocsc(self):
         """ Return Compressed Sparse Column format arrays for this matrix.
         """

Modified: trunk/scipy/sparse/tests/test_sparse.py
===================================================================
--- trunk/scipy/sparse/tests/test_sparse.py	2007-12-08 17:31:07 UTC (rev 3622)
+++ trunk/scipy/sparse/tests/test_sparse.py	2007-12-08 21:06:07 UTC (rev 3623)
@@ -1257,15 +1257,15 @@
 
 import time
 class TestSparseTools(NumpyTestCase):
-    def setUp(self):
-        self.matrices = []
+    """Simple benchmarks for sparse matrix module"""
 
-        self.matrices.append(('Identity',spidentity(10**5)))
-        self.matrices.append(('Poisson5pt', poisson2d(250)))
-        self.matrices.append(('Poisson5pt', poisson2d(500)))
-        self.matrices.append(('Poisson5pt', poisson2d(1000)))
+    def bench_matvec(self,level=5):
+        matrices = []
+        matrices.append(('Identity',spidentity(10**5)))
+        matrices.append(('Poisson5pt', poisson2d(250)))
+        matrices.append(('Poisson5pt', poisson2d(500)))
+        matrices.append(('Poisson5pt', poisson2d(1000)))
 
-    def bench_matvec(self,level=5):
         print
         print '                 Sparse Matrix Vector Product'
         print '=================================================================='
@@ -1273,7 +1273,7 @@
         print '------------------------------------------------------------------'
         fmt = '  %3s | %12s | %20s | %8d |  %6.1f '
 
-        for name,A in self.matrices:
+        for name,A in matrices:
             A = A.tocsr()
             
             x = ones(A.shape[1],dtype=A.dtype)
@@ -1293,7 +1293,41 @@
 
             print fmt % (A.format,name,shape,A.nnz,MFLOPs)
             
-            
+    def bench_matvec(self,level=5):
+        """build matrices by inserting single values"""
+        matrices = []
+        matrices.append( ('Empty',csr_matrix((10000,10000))) )
+        matrices.append( ('Identity',spidentity(10000)) )
+        matrices.append( ('Poisson5pt', poisson2d(100)) )
+        
+        print
+        print '                    Sparse Matrix Construction'
+        print '===================================================================='
+        print ' type |    name      |         shape        |    nnz   | time (sec) '
+        print '--------------------------------------------------------------------'
+        fmt = '  %3s | %12s | %20s | %8d |   %6.4f '
+
+        for name,A in matrices:
+            A = A.tocoo()
+             
+            for format in ['lil','dok']: 
+
+                start = time.clock()
+                
+                iter = 0
+                while time.clock() < start + 0.1:
+                    T = eval(format + '_matrix')(A.shape)
+                    for i,j,v in zip(A.row,A.col,A.data):
+                        T[i,j] = v
+                    iter += 1
+                end = time.clock()
+
+                name = name.center(12)
+                shape = ("%s" % (A.shape,)).center(20)
+
+                print fmt % (format,name,shape,A.nnz,(end-start)/float(iter))
+
+
     def bench_conversion(self,level=5):
         A = poisson2d(30).todense()
 




More information about the Scipy-svn mailing list