【发布时间】:2011-01-14 14:41:05
【问题描述】:
我需要 Python / Numpy 等效的 Matlab(八度)离散拉普拉斯算子(函数)del2()。我尝试了几个 Python 解决方案,但似乎没有一个与 del2 的输出相匹配。在八度我有
image = [3 4 6 7; 8 9 10 11; 12 13 14 15;16 17 18 19]
del2(image)
这给出了结果
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
在 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')
给出结果
[[ 23 19 15 11]
[ 3 -1 0 -4]
[ 4 0 0 -4]
[-13 -17 -16 -20]]
我也试过了
scipy.ndimage.filters.laplace(image)
这给出了结果
[[ 6 6 3 3]
[ 0 -1 0 -1]
[ 1 0 0 -1]
[-3 -4 -4 -5]]
所以没有一个输出似乎相互匹配。八度代码 del2.m 表明它是一个拉普拉斯算子。我错过了什么吗?
【问题讨论】:
-
在内部,运算符都是相同的(Matlab 显然除以 4,而 Python 没有)。在边界上,您可以通过同时提供
mode="wrap"到laplace()来使两个Python 版本相同。但是仅仅看Matlab的结果,我不知道Matlab在边界上做了什么。 -
实际上它在边缘进行三次外推:mathworks.it/it/help/matlab/ref/del2.html 因此,如果您尝试使用
laplace()的最后一个示例,也无法在边界上获得正确的结果。 -
你也可以试试这个scipy.sparse.csgraph.laplacian
标签: python numpy scipy scientific-computing