我有一堆x和y值形式的不均匀采样(1-D)数据,我想采用拉普拉斯算法。在numpy / scipy中有一种简单的方法吗?
我正在考虑采用渐变的渐变,但即使在均匀采样的数据中也不会引入伪影?例如,给定数据0,0,0,4,8,8,8
和1d laplace运算符1,-2,1
,laplacian将为0,0,4,0,-4,0,0
,但使用渐变的梯度将产生0,1,2,0,-2,-1,0
答案 0 :(得分:1)
到达[1, -2, 1]
运算符以获得均匀间隔网格的一种方法是使用前向差分格式计算一阶导数,使用向后差分格式计算第二导数,或者反之,因为两者都产生相同的结果。因此,不均匀网格的一个很好的选择是两种方式,然后平均结果。
假设我们正在查看一个网格点,该网格点在前一个网格点之前为hb
,在下一个网格点之后为hf
:
--+----+----+---
x-hb x x+hb
如果我没有弄乱我的代数,那么x
处的拉普拉斯算子将按上述平均值计算:
(f(x+hf)*(1+hb/hf) + f(x)(2+hb/hf+hf/hb) + f(x-hb)(1+hf/hb)) / (2*hf*hb)
你可以在一维数组上计算:
def laplacian(x, y):
x = np.asarray(x)
y = np.asarray(y)
hb = x[1:-1] - x[:-2]
hf = x[2:] - x[1:-1]
y_hb = y[:-2]
y_hf = y[2:]
hb_hf = hb / hf
hf_hb = hf / hb
return (y_hf*(1+hb_hf) - y[1:-1]*(2+hb_hf+hf_hb) +
y_hb*(1+hf_hb)) / 2 / hb / hf
>>> laplacian(range(7), [0,0,0,4,8,8,8])
array([ 0., 4., 0., -4., 0.])