[Numpy-discussion] the neighbourhood of each element of an array

Bryan Cole bryan at cole.uklinux.net
Fri Feb 23 14:39:00 EST 2007


On Fri, 2007-02-23 at 17:38 +0100, joris at ster.kuleuven.ac.be wrote:
> Hi,
> 
> Given a (possibly masked) 2d array x, is there a fast(er) way in Numpy to obtain
> the same result as the following few lines?
> 
> d = 1                                  # neighbourhood 'radius'
> Nrow = x.shape[0]
> Ncol = x.shape[1]
> y = array([[x[i-d:i+d+1,j-d:j+d+1].ravel() for j in range(d,Ncol-d)]      \
>                                            for i in range(d,Nrow-d)])
>                  

how about something like

er = Nrow - d
ec = Ncol - d
y = array([x[i:er+i, j:ec+j] for j in arange(-d,d)
				for i in arange(-d,d)])

now you're looping over a small array and combining slices of the big
array (as opposed to looping over the big array and combining slices
from a small one). This should be faster for large Nrow, Ncol.

BC


> What you get is an array containing all the elements in a neighbourhood for each
> element, disregarding the edges to avoid out-of-range problems. The code above
> becomes quite slow for e.g. a 2000x2000 array. Does anyone know a better
> approach?
> 
> Ciao,
> Joris
> 
> 
> 
> Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm





More information about the NumPy-Discussion mailing list