# [Scipy-tickets] [SciPy] #796: ndimage.shift destroys data from edges

SciPy scipy-tickets@scipy....
Sat Nov 29 09:24:04 CST 2008

#796: ndimage.shift destroys data from edges
---------------------------+------------------------------------------------
Reporter:  0ion9          |        Owner:  somebody
Type:  defect         |       Status:  new
Priority:  normal         |    Milestone:
Component:  scipy.ndimage  |      Version:  devel
Severity:  normal         |   Resolution:
Keywords:                 |
---------------------------+------------------------------------------------
Comment (by NeilMuller):

In ni_interpolate.c, map_coordinate normalises by len-1 rather than len
when using wrap, so, when dealing with the n'th column of an array, the
answer maps to 1 rather than 0.

The following patch fixes this, and fixes the behaviour for the given
example:

--- scipy/ndimage/src/ni_interpolation.c        (revision 5203)
+++ scipy/ndimage/src/ni_interpolation.c        (working copy)
@@ -140,10 +140,14 @@
if (len <= 1) {
in = 0;
} else {
-                maybelong sz = len - 1;
+                maybelong sz = len;
// Integer division of -in/sz gives (-in mod sz)
// Note that 'in' is negative
in += sz * ((maybelong)(-in / sz) + 1);
+                // This maps to the range [1, len], so we need to wrap to
+                // make this [0, len-1]
+                if (in == len)
+                   in = 0;
}
break;
case NI_EXTEND_NEAREST:
@@ -179,7 +183,7 @@
if (len <= 1) {
in = 0;
} else {
-                maybelong sz = len - 1;
+                maybelong sz = len;
in -= sz * (maybelong)(in / sz);
}
break;

However, this breaks the current tests for wrap. Given that the current
test includes the assertation that:

sni.geometric_transform(np.array([1,2,3,4]),lambda c: (c[0] - 0.9,),
cval=-1,mode='wrap', output_shape=(4,)) == [3, 1, 2, 3]

I think the current behaviour of 'wrap' is wrong, but that prehaps needs
more discussion before changing anything.

--
Ticket URL: <http://scipy.org/scipy/scipy/ticket/796#comment:2>
SciPy <http://www.scipy.org/>
SciPy is open-source software for mathematics, science, and engineering.