[Scipy-svn] r3220 - in trunk/Lib/sparse: . tests

scipy-svn at scipy.org scipy-svn at scipy.org
Wed Aug 1 13:08:23 EDT 2007


Author: stefan
Date: 2007-08-01 12:07:49 -0500 (Wed, 01 Aug 2007)
New Revision: 3220

Modified:
   trunk/Lib/sparse/sparse.py
   trunk/Lib/sparse/tests/test_sparse.py
Log:
Add lil_diags.


Modified: trunk/Lib/sparse/sparse.py
===================================================================
--- trunk/Lib/sparse/sparse.py	2007-08-01 16:18:38 UTC (rev 3219)
+++ trunk/Lib/sparse/sparse.py	2007-08-01 17:07:49 UTC (rev 3220)
@@ -9,7 +9,7 @@
             'lil_matrix','dok_matrix', 
             'spdiags','speye','spidentity', 
             'isspmatrix','issparse','isspmatrix_csc','isspmatrix_csr',
-            'isspmatrix_lil','isspmatrix_dok', 'lil_eye' ]
+            'isspmatrix_lil','isspmatrix_dok', 'lil_eye', 'lil_diags' ]
 
 import warnings
 
@@ -2674,6 +2674,51 @@
         out.data[c-k].append(1)
     return out
 
+def lil_diags(diags,offsets,(m,n),dtype=float):
+    """Generate a lil_matrix with the given diagonals.
+
+    :Parameters:
+        diags : list of list of values e.g. [[1,2,3],[4,5]]
+            Values to be placed on each indicated diagonal.
+        offsets : list of ints
+            Diagonal offsets.  This indicates the diagonal on which
+            the given values should be placed.
+        (r,c) : tuple of ints
+            Row and column dimensions of the output.
+        dtype : dtype
+           Output data-type.
+
+    Example:
+    -------
+
+    >>> lil_diags([[1,2,3],[4,5],[6]],[0,1,2],(3,3)).todense()
+    matrix([[ 1.,  4.,  6.],
+            [ 0.,  2.,  5.],
+            [ 0.,  0.,  3.]])
+
+    """
+    offsets_unsorted = list(offsets)
+    diags_unsorted = list(diags)
+    if len(diags) != len(offsets):
+        raise ValueError("Number of diagonals provided should "
+                         "agree with offsets.")
+
+    sort_indices = numpy.argsort(offsets_unsorted)
+    diags = [diags_unsorted[k] for k in sort_indices]
+    offsets = [offsets_unsorted[k] for k in sort_indices]
+
+    for i,k in enumerate(offsets):
+        if len(diags[i]) < m-abs(k):
+            raise ValueError("Not enough values specified to fill "
+                             "diagonal %s." % k)
+
+    out = lil_matrix((m,n),dtype=dtype)
+    for k,diag in itertools.izip(offsets,diags):
+        for ix,c in enumerate(xrange(clip(k,0,n),clip(m+k,0,n))):
+            out.rows[c-k].append(c)
+            out.data[c-k].append(diag[ix])
+    return out
+
 def issequence(t):
     return isinstance(t, (list, tuple))
 

Modified: trunk/Lib/sparse/tests/test_sparse.py
===================================================================
--- trunk/Lib/sparse/tests/test_sparse.py	2007-08-01 16:18:38 UTC (rev 3219)
+++ trunk/Lib/sparse/tests/test_sparse.py	2007-08-01 17:07:49 UTC (rev 3220)
@@ -22,7 +22,7 @@
 from numpy.testing import *
 set_package_path()
 from scipy.sparse import csc_matrix, csr_matrix, dok_matrix, coo_matrix, \
-     spidentity, speye, lil_matrix, lil_eye
+     spidentity, speye, lil_matrix, lil_eye, lil_diags
 from scipy.linsolve import splu
 restore_path()
 
@@ -32,7 +32,7 @@
         self.dat = matrix([[1,0,0,2],[3,0,1,0],[0,2,0,0]],'d')
         self.datsp = self.spmatrix(self.dat)
 
-    def check_getelement(self):        
+    def check_getelement(self):
         assert_equal(self.datsp[0,0],1)
         assert_equal(self.datsp[0,1],0)
         assert_equal(self.datsp[1,0],3)
@@ -872,7 +872,37 @@
                 assert_array_equal(lil_eye(dim,k).todense(),
                                    speye(r,c,k).todense())
 
+    def check_lil_diags(self):
+        assert_array_equal(lil_diags([[1,2,3],[4,5],[6]],
+                                     [0,1,2],(3,3)).todense(),
+                           [[1,4,6],
+                            [0,2,5],
+                            [0,0,3]])
 
+        assert_array_equal(lil_diags([[6],[4,5],[1,2,3]],
+                                     [2,1,0],(3,3)).todense(),
+                           [[1,4,6],
+                            [0,2,5],
+                            [0,0,3]])
+
+        assert_array_equal(lil_diags([[6,7,8],[4,5],[1,2,3]],
+                                     [2,1,0],(3,3)).todense(),
+                           [[1,4,6],
+                            [0,2,5],
+                            [0,0,3]])
+
+        assert_array_equal(lil_diags([[1,2,3],[4,5],[6]],
+                                     [0,-1,-2],(3,3)).todense(),
+                           [[1,0,0],
+                            [4,2,0],
+                            [6,5,3]])
+
+        assert_array_equal(lil_diags([[6,7,8],[4,5]],
+                                     [-2,-1],(3,3)).todense(),
+                           [[0,0,0],
+                            [4,0,0],
+                            [6,5,0]])
+
 class test_construct_utils(NumpyTestCase):
     def check_identity(self):
         a = spidentity(3)




More information about the Scipy-svn mailing list