[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