Python 二维线性插值产生的结果超出了数据范围

Python 二维线性插值产生的结果超出了数据范围,python,scipy,spline,spatial-interpolation,Python,Scipy,Spline,Spatial Interpolation,我正在使用该方法生成线性样条函数。对于某些点集,结果函数产生的结果是我无法预料的。例如: from scipy import interpolate x = [81, 81, 81, 83, 83, 83] y = [ 9, 7, 5, 9, 7, 5] z = [23.75374, 23.75416, 23.75376, 23.75621, 23.75581, 23.75686] f = interpolate.interp2d(x, y, z, kind='linear') p

我正在使用该方法生成线性样条函数。对于某些点集,结果函数产生的结果是我无法预料的。例如:

from scipy import interpolate

x = [81, 81, 81, 83, 83, 83]
y = [ 9,  7,  5,  9,  7,  5]
z = [23.75374, 23.75416, 23.75376, 23.75621, 23.75581, 23.75686]
f = interpolate.interp2d(x, y, z, kind='linear')

print (str(f(82, 6)[0]))
print (str(f(82.5, 6.5)[0]))
print (str(f(81.5, 5.5)[0]))
生成以下输出:

8.07860599193
0.240930002164
15.9162159912
我会尝试使用此插值方法的刚度参数,但显然它在
interp2d
中不可用

是什么导致了这些结果?如何避免它们?

如何避免这种情况 在矩形网格的点处进行插值时,最好通过提供网格结构数据告诉interp2d这就是正在发生的情况:x坐标的m值、y坐标的n值以及形状为(n,m)的z。使用与您相同的点,我们可以得到正确的结果:

x = [81, 83]
y = [9, 7, 5]
z = np.array([[23.75374, 23.75416, 23.75376], [23.75621, 23.75581, 23.75686]]).T
f = interpolate.interp2d(x, y, z, kind='linear')
print(f(82, 6)[0], f(82.5, 6.5)[0], f(81.5, 5.5)[0])
输出
23.7551475 23.755569375 23.754544375

为什么会这样 样条曲线构造例程需要一个三角形网格来构建分段线性函数。它不知道您传递的值位于矩形网格上;它只看到一堆点,其中许多点是共线的,不知道如何从它们形成三角形。所以它添加了另外三个顶点,其坐标在(82.5,5)、(82.5,7)、(82.5,9)附近,以便生成此类三角形。问题是,因为我们在这些点上没有值,所以它们被认为是零。当然,插入剂当时毫无价值

有人可能会问,为什么算法没有显示一些警告,结果是不可靠的? 是的。在禁用安静模式的情况下,将您的点直接传递给bisplrep

spl = interpolate.bisplrep(x, y, z, kx=1, ky=1, s=0, quiet=0)
显示

运行时警告:警告。样条曲线的系数被计算为秩亏系统的最小范数最小二乘解。kx,ky=1,1 nx,ny=5,5 m=6 fp=0.000000s=0.000000 warning.warn(运行时警告)


翻译:“我没有足够的数据,所以我编了一些。”。interp2d方法在内部调用bisplrep,但会抑制其错误消息…

文档远不能解释这一点。