Python中的离散拉普拉斯算子(del2等价)

BBD*_*Sys 5 python numpy scientific-computing scipy

我需要Python/Numpy等效的Matlab(Octave)离散拉普拉斯算子(函数)del2().我试过几个Python解决方案,其中没有一个似乎与del2的输出相匹配.在Octave我有

image = [3 4 6 7; 8 9 10 11; 12 13 14 15;16 17 18 19]
del2(image)
Run Code Online (Sandbox Code Playgroud)

这给出了结果

   0.25000  -0.25000  -0.25000  -0.75000
  -0.25000  -0.25000   0.00000   0.00000
   0.00000   0.00000   0.00000   0.00000
   0.25000   0.25000   0.00000   0.00000
Run Code Online (Sandbox Code Playgroud)

在Python上我试过了

import numpy as np
from scipy import ndimage
import scipy.ndimage.filters

image =  np.array([[3, 4, 6, 7],[8, 9, 10, 11],[12, 13, 14, 15],[16, 17, 18, 19]])
stencil = np.array([[0, 1, 0],[1, -4, 1], [0, 1, 0]])
print ndimage.convolve(image, stencil, mode='wrap')
Run Code Online (Sandbox Code Playgroud)

给出了结果

[[ 23  19  15  11]
 [  3  -1   0  -4]
 [  4   0   0  -4]
 [-13 -17 -16 -20]]
Run Code Online (Sandbox Code Playgroud)

我也试过了

scipy.ndimage.filters.laplace(image)
Run Code Online (Sandbox Code Playgroud)

这给出了结果

[[ 6  6  3  3]
 [ 0 -1  0 -1]
 [ 1  0  0 -1]
 [-3 -4 -4 -5]]
Run Code Online (Sandbox Code Playgroud)

所以没有一个输出似乎相互匹配.Octave代码del2.m表明它是拉普拉斯算子.我错过了什么吗?

2da*_*aaa 6

您可以通过将数组与适当的模板卷积来使用convolve计算laplacian :

from scipy.ndimage import convolve
stencil= (1.0/(12.0*dL*dL))*np.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]])
convolve(e2, stencil, mode='wrap')
Run Code Online (Sandbox Code Playgroud)