1

After going through the N-Dimensional array convolution in Python found here on SO I now face a problem around which I cannot wrap my head. The convolution provided by from scipy.ndimage does not allow to select the 'valid' part of the convolution like Matlab's convn so we need to slice out the valid part.

"valid = [slice(kernel.shape[0]//2, -kernel.shape[0]//2), slice(kernel.shape[1]//2, -kernel.shape[1]//2)]"

With a kernel size of [2x2], I not sure as to why I do not get a valid slice for a convolution of image [24x24] with the kernel.

z =  convolve(image,kernel)[valid]

In return I get a [22x22] image, where I was expecting a [23x23] image. I thus checked the values of the slice and it seems that -1 does not work here.

Doing a manual slice

convolve(image,kernel)[1:-1,1:-1] ---> Gives 22x22
convolve(image,kernel)[1:,1:] ---> Gives 23x23

So the question is... How come -1 gives the last item of a simple array but in my case of slicing it ignores it?

a= np.array([100,101,102])
a[-1]
102
Community
  • 1
  • 1
Wajih
  • 793
  • 3
  • 14
  • 31

1 Answers1

4

In Python the upper bound of a slice is open

In [699]: np.arange(5)
Out[699]: array([0, 1, 2, 3, 4])
In [700]: np.arange(5)[:4]
Out[700]: array([0, 1, 2, 3])
In [701]: np.arange(5)[:-1]
Out[701]: array([0, 1, 2, 3])
In [702]: np.arange(5)[1:-1]
Out[702]: array([1, 2, 3])

In all Python cases, list and arrays, slice(1,-1) removes both the first and the last item. slice(1,None) (same as x[1:]) removes just the first.

By itself the -1 means the last; in a slice it means up to, but including, the last.

In [703]: np.arange(5)[-1]
Out[703]: 4

I assume the problem is just about slicing, and applies to any array regardless of whether it comes from a convolution or not.

hpaulj
  • 221,503
  • 14
  • 230
  • 353