气象 python 二维线性插值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了气象 python 二维线性插值相关的知识,希望对你有一定的参考价值。

参考技术A

scipy.interpolate.griddata(points, values, xi, method=\'linear\', fill_value=nan, rescale=False)
官网: https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html?highlight=griddata

一维数组,shape为(n,) ,是需要插值的变量数据
如果需要插值的变量var是一个多维数组,则需要转换成一维的
方法:var.ravel()

values的坐标,shape为(n,D),第一维需要与values长度相同,
D就是values的坐标轴个数
如果是在地图上,D为2,分别是lon、lat,是values中对应的每个数据的lat和lon

插值过后的新的坐标,shape为(m, D) ,第二维与points的第二维相同

插值方法,有 ‘linear’, ‘nearest’, ‘cubic’
nearest:返回最接近插值点的数据点的值
linear:线性插值
cubic:三次样条

用于填充输入点凸包之外的请求点的值。如果未提供,则默认值为 nan 。此选项对‘nearest’ 方法无效。

在执行插值之前将点重新缩放到单位立方体。如果某些输入维度具有不可比较的单位并且相差许多数量级,这将很有用。

二维线性插值产生数据范围之外的结果

我使用interp2d方法生成线性样条函数。对于某些点集,结果函数产生的结果是我不希望的。例如。:

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中不可用。

是什么导致这些结果?他们怎么能避免?

答案

How to avoid this

当在矩形网格的点处进行插值时,最好通过给出网格结构数据来告诉interp2d这是正在发生的事情:x坐标的m值,y坐标的n值和形状的z(n,m) )。使用与您相同的积分,我们得到正确的结果:

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

Why this happens

样条构造例程需要三角形网格来构建分段线性函数。它不知道您传递的值位于矩形网格上;它只是看到一堆点,其中许多是共线的,并且不了解如何从它们形成三角形。所以...它增加了三个顶点,坐标围绕(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.000000 s = 0.000000 warnings.warn(RuntimeWarning(_mess))

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

以上是关于气象 python 二维线性插值的主要内容,如果未能解决你的问题,请参考以下文章

插值二维点数组

拟合函数:线性插值_样条插值(一维,二维,三维)_最小二乘拟合

二维线性插值产生数据范围之外的结果

python线性插值解析

numpy的一维线性插值函数

Python数学建模系列:数值逼近