[SciPy-User] ndimage.convolve
Zachary Pincus
zachary.pincus at yale.edu
Thu Dec 10 13:08:39 EST 2009
> I want to take the laplacian of a 2-d field which has periodic
> boundary conditions. I tried doing this using ndimage.convolve, but
> when I test this on a simple function I don't get the result I
> expect. Why aren't the boundary elements going to zero as well in
> the following example?
>
>
> A= np.array([[x + y for x in np.arange(0,10)] for y in
> np.arange(0,10)])
> stencil=[[0,0,-1,0,0],[0,0,16,0,0],[-1,16,-60,16,-1],[0,0,16,0,0],
> [0,0,-1,0,0]]
> ndimage.convolve(A,stencil,mode='wrap')
>
> array([[ 300, 140, 150, 150, 150, 150, 150, 150, 160, 0],
> [ 140, -20, -10, -10, -10, -10, -10, -10, 0, -160],
> [ 150, -10, 0, 0, 0, 0, 0, 0, 10, -150],
> [ 150, -10, 0, 0, 0, 0, 0, 0, 10, -150],
> [ 150, -10, 0, 0, 0, 0, 0, 0, 10, -150],
> [ 150, -10, 0, 0, 0, 0, 0, 0, 10, -150],
> [ 150, -10, 0, 0, 0, 0, 0, 0, 10, -150],
> [ 150, -10, 0, 0, 0, 0, 0, 0, 10, -150],
> [ 160, 0, 10, 10, 10, 10, 10, 10, 20, -140],
> [ 0, -160, -150, -150, -150, -150, -150, -150, -140, -300]])
I feel that I am missing something, because this seems like the
expected behavior.
You're convolving this matrix:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
[ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
[ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
[ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
[ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
[ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]])
With this kernel:
array([[ 0, 0, -1, 0, 0],
[ 0, 0, 16, 0, 0],
[ -1, 16, -60, 16, -1],
[ 0, 0, 16, 0, 0],
[ 0, 0, -1, 0, 0]])
using *wraparound* boundary conditions (not mirroring!). I fail to see
why the result is unexpected...
For simplicity, let's look at the equivalent 1D case:
matrix:
[ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
kernel:
[ -1, 16, -30, 16, -1]
At the right edge, you have this:
[ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] 5 6
*
[ -1, 16,-30, 16, -1]
where the "phantom" 5 and 6 come from the wraparound boundary condition.
-1*12 + 16*13 + -30*14 + 16*5 + -1*6 does not equal zero!
ndimage.convolve([ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], [ -1,
16,-30, 16, -1], mode='wrap')
array([ 150, -10, 0, 0, 0, 0, 0, 0, 10, -150])
Zach
ps: more straightforward way to construct A matrix above:
np.add.outer(np.arange(10), np.arange(10))
More information about the SciPy-User
mailing list