Wajih Wajih - 1 year ago 70
Python Question

Slicing after convolution , -1 index does not work

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

does not allow to select the 'valid' part of the convolution like Matlab's
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])

Answer Source

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.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download