[Scipy-svn] r3461 - in trunk/scipy/io: . tests

scipy-svn@scip... scipy-svn@scip...
Wed Oct 24 17:55:21 CDT 2007


Author: wnbell
Date: 2007-10-24 17:55:18 -0500 (Wed, 24 Oct 2007)
New Revision: 3461

Modified:
   trunk/scipy/io/mmio.py
   trunk/scipy/io/tests/test_mmio.py
Log:
simplified and improved speed of matrix market sparse IO
added complex sparse MMIO unittest 


Modified: trunk/scipy/io/mmio.py
===================================================================
--- trunk/scipy/io/mmio.py	2007-10-24 21:20:22 UTC (rev 3460)
+++ trunk/scipy/io/mmio.py	2007-10-24 22:55:18 UTC (rev 3461)
@@ -14,6 +14,7 @@
 
 import os
 from numpy import asarray, real, imag, conj, zeros, ndarray
+from itertools import izip
 
 __all__ = ['mminfo','mmread','mmwrite']
 
@@ -334,12 +335,16 @@
         format = '%i %i ' + format
         target.write('%i %i %i\n' % (rows,cols,entries))
         assert symm=='general',`symm`
+
+        coo = a.tocoo() # convert to COOrdinate format
+        I,J,V = coo.row + 1, coo.col + 1, coo.data # change base 0 -> base 1
+
         if field in ['real','integer']:
-            for i in range(entries):
-                target.write(format % (a.rowcol(i)[0] + 1,a.rowcol(i)[1] + 1,a.getdata(i))) #convert base 0 to base 1
+            for ijv_tuple in izip(I,J,V):
+                target.writelines(format % ijv_tuple)
         elif field=='complex':
-            for i in range(entries):
-                target.write(format % (a.rowcol(i)[0] + 1,a.rowcol(i)[1] + 1,real(a.getdata(i)),imag(a.getdata(i))))
+            for ijv_tuple in izip(I,J,V.real,V.imag):
+                target.writelines(format % ijv_tuple)
         elif field=='pattern':
             raise NotImplementedError,`field`
         else:

Modified: trunk/scipy/io/tests/test_mmio.py
===================================================================
--- trunk/scipy/io/tests/test_mmio.py	2007-10-24 21:20:22 UTC (rev 3460)
+++ trunk/scipy/io/tests/test_mmio.py	2007-10-24 22:55:18 UTC (rev 3461)
@@ -152,7 +152,7 @@
         b = mmread(fn).todense()
         assert_array_almost_equal(a,b)
 
-    def check_simple_write_read(self):
+    def check_real_write_read(self):
         I = array([0, 0, 1, 2, 3, 3, 3, 4])
         J = array([0, 3, 1, 2, 1, 3, 4, 4])
         V = array([  1.0,   6.0,   10.5, 0.015,   250.5,  -280.0, 33.32, 12.0 ])
@@ -163,14 +163,25 @@
         mmwrite(fn,b)
         
         assert_equal(mminfo(fn),(5,5,8,'coordinate','real','general'))
-        a = [[1,    0,      0,       6,      0],
-             [0,   10.5,    0,       0,      0],
-             [0,    0,    .015,      0,      0],
-             [0,  250.5,    0,     -280,    33.32],
-             [0,    0,      0,       0,     12]]
+        a = b.todense()
         b = mmread(fn).todense()
         assert_array_almost_equal(a,b)
 
+    def check_complex_write_read(self):
+        I = array([0, 0, 1, 2, 3, 3, 3, 4])
+        J = array([0, 3, 1, 2, 1, 3, 4, 4])
+        V = array([  1.0 + 3j,    6.0 + 2j,  10.50 + 0.9j, 0.015 + -4.4j,   
+                   250.5 + 0j, -280.0 + 5j,  33.32 + 6.4j, 12.00 + 0.8j])
+        
+        b = scipy.sparse.coo_matrix((V,(I,J)),dims=(5,5))
+        
+        fn = mktemp()
+        mmwrite(fn,b)
+        
+        assert_equal(mminfo(fn),(5,5,8,'coordinate','complex','general'))
+        a = b.todense()
+        b = mmread(fn).todense()
+        assert_array_almost_equal(a,b)
 
 if __name__ == "__main__":
     NumpyTest().run()



More information about the Scipy-svn mailing list