[Scipy-svn] r7110 - trunk/scipy/fftpack

scipy-svn at scipy.org scipy-svn at scipy.org
Mon Jan 31 16:14:51 EST 2011


Author: ptvirtan
Date: 2011-01-31 15:14:50 -0600 (Mon, 31 Jan 2011)
New Revision: 7110

Modified:
   trunk/scipy/fftpack/basic.py
Log:
BUG: fftpack: fix data overwriting in FFT routines (#1353)

The _fix_shape helper routine in some cases returns slices of the input
array, which does not create copies. In those cases, one should not set
overwrite_x=1.

Modified: trunk/scipy/fftpack/basic.py
===================================================================
--- trunk/scipy/fftpack/basic.py	2011-01-30 21:05:44 UTC (rev 7109)
+++ trunk/scipy/fftpack/basic.py	2011-01-31 21:14:50 UTC (rev 7110)
@@ -113,14 +113,14 @@
         index = [slice(None)]*len(s)
         index[axis] = slice(0,n)
         x = x[index]
+        return x, False
     else:
         index = [slice(None)]*len(s)
         index[axis] = slice(0,s[axis])
         s[axis] = n
         z = zeros(s,x.dtype.char)
         z[index] = x
-        x = z
-    return x
+        return z, True
 
 
 def _raw_fft(x, n, axis, direction, overwrite_x, work_function):
@@ -128,8 +128,8 @@
     if n is None:
         n = x.shape[axis]
     elif n != x.shape[axis]:
-        x = _fix_shape(x,n,axis)
-        overwrite_x = 1
+        x, copy_made = _fix_shape(x,n,axis)
+        overwrite_x = overwrite_x or copy_made
     if axis == -1 or axis == len(x.shape)-1:
         r = work_function(x,n,direction,overwrite_x=overwrite_x)
     else:
@@ -208,8 +208,8 @@
     if n is None:
         n = tmp.shape[axis]
     elif n != tmp.shape[axis]:
-        tmp = _fix_shape(tmp,n,axis)
-        overwrite_x = 1
+        tmp, copy_made = _fix_shape(tmp,n,axis)
+        overwrite_x = overwrite_x or copy_made
 
     if axis == -1 or axis == len(tmp.shape) - 1:
         return work_function(tmp,n,1,0,overwrite_x)
@@ -261,8 +261,8 @@
     if n is None:
         n = tmp.shape[axis]
     elif n != tmp.shape[axis]:
-        tmp = _fix_shape(tmp,n,axis)
-        overwrite_x = 1
+        tmp, copy_made = _fix_shape(tmp,n,axis)
+        overwrite_x = overwrite_x or copy_made
 
     if axis == -1 or axis == len(tmp.shape) - 1:
         return work_function(tmp,n,-1,1,overwrite_x)
@@ -379,7 +379,7 @@
     # No need to swap axes, array is in C order
     if noaxes:
         for i in axes:
-            x = _fix_shape(x, s[i], i)
+            x, copy_made = _fix_shape(x, s[i], i)
         #print x.shape, s
         return work_function(x,s,direction,overwrite_x=overwrite_x)
 
@@ -403,7 +403,7 @@
     shape[waxes] = s
 
     for i in range(len(waxes)):
-        x = _fix_shape(x, s[i], waxes[i])
+        x, copy_made = _fix_shape(x, s[i], waxes[i])
 
     r = work_function(x, shape, direction, overwrite_x=overwrite_x)
 




More information about the Scipy-svn mailing list