[Scipy-svn] r4611 - branches/Interpolate1D

scipy-svn@scip... scipy-svn@scip...
Thu Aug 7 18:42:51 CDT 2008


Author: fcady
Date: 2008-08-07 18:42:44 -0500 (Thu, 07 Aug 2008)
New Revision: 4611

Modified:
   branches/Interpolate1D/TODO.txt
   branches/Interpolate1D/info.py
   branches/Interpolate1D/interpolateNd.py
Log:
added prefiltering from ndimage, which it turns out is necessary to get good data with spline order >1.  It still needs work to make it pretty and integrated, but it is functional

Modified: branches/Interpolate1D/TODO.txt
===================================================================
--- branches/Interpolate1D/TODO.txt	2008-08-07 21:25:16 UTC (rev 4610)
+++ branches/Interpolate1D/TODO.txt	2008-08-07 23:42:44 UTC (rev 4611)
@@ -36,6 +36,15 @@
     
 **include spline pre-filtering in ND interpolation,
     or understand why we don't need to do that.
+    
+    It appears that higher-order splines also smooth the data
+    increasingly.  Yes, I checked and they definitely don't
+    reproduce perfectly the input; they flatten stuff.
+    
+    The pre-filtering definitely improves the output by a whole lot;
+    I suspect it returns some sort of transform of the data.  But I
+    really wish I knew what it did; why didn't this guy document his
+    code better than he did??
 
 **README file that describes the architecture of the
     package and also includes license information.
@@ -48,9 +57,13 @@
 
 **allow newx to be in non-sorted order for 1D
     This requires rethinking the partition of newx into
-    low, high and mid
+    low, high and kind
     
-**put all extension files into their own directory
+    The main hurdle is that I can only really fill and array
+    using result[mask] = partial_result if I can guarantee
+    that everything will have the same type.  Maybe it is
+    worth compromising the generality of the function to
+    allow that.
     
 ********* LONGER TERM ************
 

Modified: branches/Interpolate1D/info.py
===================================================================
--- branches/Interpolate1D/info.py	2008-08-07 21:25:16 UTC (rev 4610)
+++ branches/Interpolate1D/info.py	2008-08-07 23:42:44 UTC (rev 4611)
@@ -27,7 +27,7 @@
     
     The following callable classes are also provided:
 
-        Interpolate1d  :   an object for interpolation of
+        Interpolate1d  :   an object for 1D interpolation of
                                 various kinds.  interp1d is a wrapper
                                 around this class.
                                 
@@ -36,15 +36,21 @@
                                 is used.  However, not all functionality
                                 of Spline is available through Interpolate1d.
                                 
-        Interpolate2d  :
+        Interpolate2d  :  an object for 2D interpolation of
+                                various kinds.  interp2d is a wrapper
+                                around this class.
         
-        Spline 2d  :  
+        Spline2d  :  an object for spline interpolation.  Interpolate1d
+                                wraps this class if spline interpolation
+                                is used.  However, not all functionality
+                                of Spline2d is available through Interpolate1d.
         
-        InterpolateNd  :
+        InterpolateNd  :  an object for interpolation of ND data.  interpNd
+                                is a wrapper around this class.
         
     These functions and classes constitute the primary api.  However, several
-    additional functions are also provided (the primary api in many cases calls
-    these functions):
+    additional less generic functions are also provided for more direct interpolation.
+    They don't have as crafted a UI as those above, but they are quick and easy:
 
         linear : linear interpolation
         logarithmic :  logarithmic interpolation

Modified: branches/Interpolate1D/interpolateNd.py
===================================================================
--- branches/Interpolate1D/interpolateNd.py	2008-08-07 21:25:16 UTC (rev 4610)
+++ branches/Interpolate1D/interpolateNd.py	2008-08-07 23:42:44 UTC (rev 4611)
@@ -132,6 +132,7 @@
         """
         
         # FIXME : include spline filtering
+        # the ndimage module says that it requires pre-filtering for 
         
         # checking format of input
         data = array(data)
@@ -191,8 +192,16 @@
         else:
             raise ValueError, "argument kind = %s not recognized" % str(kind)
                 
+        
+        # This step is done because it is required by the ndimage code that I'm scavenging.
+        # I don't fully understand why it must do this, and that's a problem.  But empirically
+        # this step is needed in order to get good-looking data.
+        if self.order >1:
+            self._data_array = spline_filter(data, self.order)
+        else:
+            self._data_array = data
+        
         # storing relevant data
-        self._data_array = data
         self.ndim = data.ndim
         self._shape = np.shape(data)
         self._spacings = spacings
@@ -295,4 +304,40 @@
         
         
     
-    
\ No newline at end of file
+    
+import _ni_support
+
+def spline_filter1d(input, order = 3, axis = -1, output = np.float64,
+                    output_type = None):
+                    # takes array and everything; we can make input safe if user never touches it
+    """ Calculates a one-dimensional spline filter along the given axis.
+
+        The lines of the array along the given axis are filtered by a
+        spline filter. The order of the spline must be >= 2 and <= 5.
+    """    
+    if order in [0, 1]:
+        output[...] = np.array(input)
+    else:
+        _nd_image.spline_filter1d(input, order, axis, output)
+    return output
+
+def spline_filter(input, order = 3, output = np.float64,
+                  output_type = None):
+    """ Multi-dimensional spline filter.
+
+        Note: The multi-dimensional filter is implemented as a sequence of
+        one-dimensional spline filters. The intermediate arrays are stored
+        in the same data type as the output. Therefore, for output types
+        with a limited precision, the results may be imprecise because
+        intermediate results may be stored with insufficient precision.
+    """
+                                                    
+    output = np.zeros( np.shape(input) , dtype=np.float64 ) # place to store the data
+                                                    
+    if order not in [0, 1] and input.ndim > 0:
+        for axis in range(input.ndim):
+            spline_filter1d(input, order, axis, output = output)
+            input = output
+    else:
+        output[...] = input[...]
+    return output
\ No newline at end of file



More information about the Scipy-svn mailing list