[Scipy-svn] r5268 - in trunk/scipy/interpolate: . tests

scipy-svn@scip... scipy-svn@scip...
Tue Dec 16 03:35:01 CST 2008


Author: ptvirtan
Date: 2008-12-16 03:34:47 -0600 (Tue, 16 Dec 2008)
New Revision: 5268

Modified:
   trunk/scipy/interpolate/interpolate.py
   trunk/scipy/interpolate/tests/test_interpolate.py
Log:
interp1d: Fix spurious casting of complex data to real. Fail early with complex data + splines -- these don't work yet due to _fitpack.bisplev being written in C. Add tests with complex data

Modified: trunk/scipy/interpolate/interpolate.py
===================================================================
--- trunk/scipy/interpolate/interpolate.py	2008-12-15 19:01:36 UTC (rev 5267)
+++ trunk/scipy/interpolate/interpolate.py	2008-12-16 09:34:47 UTC (rev 5268)
@@ -217,7 +217,7 @@
             raise ValueError("the y array must have at least one dimension.")
 
         # Force-cast y to a floating-point type, if it's not yet one
-        if not isinstance(y.dtype.type, np.inexact):
+        if not issubclass(y.dtype.type, np.inexact):
             y = y.astype(np.float_)
 
         # Normalize the axis to ensure that it is positive.
@@ -248,6 +248,9 @@
             self._call = self._call_spline
             self._spline = splmake(x,oriented_y,order=order)
 
+            if issubclass(y.dtype.type, np.complexfloating):
+                raise ValueError("Input data must be real for spline interpolation")
+
         len_x = len(x)
         if len_x != len_y:
             raise ValueError("x and y arrays must be equal in length along "

Modified: trunk/scipy/interpolate/tests/test_interpolate.py
===================================================================
--- trunk/scipy/interpolate/tests/test_interpolate.py	2008-12-15 19:01:36 UTC (rev 5267)
+++ trunk/scipy/interpolate/tests/test_interpolate.py	2008-12-16 09:34:47 UTC (rev 5268)
@@ -292,6 +292,35 @@
             yield self._nd_check_interp, kind
             yield self._nd_check_shape, kind
 
+    def _check_complex(self, dtype=np.complex_, kind='linear', fail=False):
+        x = np.arange(10).astype(np.int_)
+        y = np.arange(10).astype(np.int_) * (1 + 2j)
+        y = y.astype(dtype)
+        if fail:
+            assert_raises(ValueError, interp1d, x, y, kind=kind)
+        else:
+            c = interp1d(x, y, kind=kind)
+            assert_array_almost_equal(y[:-1], c(x)[:-1])
+        assert (y.dtype == dtype) or not issubclass(y.dtype.type, np.inexact)
+
+    def test_complex(self):
+        for kind in ('linear', 'nearest'):
+            yield self._check_complex, np.complex64, kind
+            yield self._check_complex, np.complex128, kind
+            yield self._check_complex, np.float32, kind
+            yield self._check_complex, np.float64, kind
+
+        # The spline methods can't handle complex values, because the code
+        # for _fitpack.bispleval is written in C and is not type-agnostic.
+        #
+        # Check that a ValueError is raised if one attempts to interpolate
+        # complex data using these routines.
+        for kind in ('cubic', 'slinear', 'quadratic', 'zero'):
+            yield self._check_complex, np.complex64, kind, True
+            yield self._check_complex, np.complex128, kind, True
+            yield self._check_complex, np.float32, kind
+            yield self._check_complex, np.float64, kind
+
     @dec.knownfailureif(True, "zero-order splines fail for the last point")
     def test_nd_zero_spline(self):
         # zero-order splines don't get the last point right,



More information about the Scipy-svn mailing list