SciPy LinearNDInterpolator RegularGridInterpolator 对于相同的数据产生不同的结果

问题描述 投票:0回答:1

我正在尝试使用 SciPy 中的

LinearNDInterpolator
RegularGridInterpolator
函数来线性插值 1D、2D 和 3D 数据。

我知道这两种方法之间的主要区别在于

RegularGridInterpolator
设计用于处理具有均匀或不均匀间距的直线(或“规则”)网格上的数据。这个功能也比
LinearNDInterpolator
更有效率。

但是,当我在间距均匀的直线网格上生成随机数据时,这两种方法获得的结果并不匹配。我希望它们是相似的,因为网格是规则的,并且我在这两种情况下都使用线性插值。

这是我用来比较这两种方法的代码:

import numpy as np
from scipy.interpolate import LinearNDInterpolator
from scipy.interpolate import RegularGridInterpolator
import matplotlib.pyplot as plt

#original data
x = np.linspace(0, 1, num=20)
y = np.linspace(1, 2, num=10)
X, Y = np.meshgrid(x, y)
values = np.random.rand(20, 10)
points = np.column_stack((X.flatten(), Y.flatten()))
values_flat = values.flatten()

#LinearNDInterpolation
interfunc = LinearNDInterpolator(points, values_flat)
x1 = np.linspace(0, 1, num=3000)
y1 = np.linspace(1, 2, num=3000)
X1, Y1 = np.meshgrid(x1, y1)
interpolated_values = interfunc(np.column_stack((X1.flatten(), Y1.flatten())))
interpolated_values = interpolated_values.reshape(X1.shape)
fig, ax = plt.subplots()
linear = ax.contourf(X1, Y1, interpolated_values.T)
fig.colorbar(linear, ax=ax)

#RegularGridInterpolation
fig2, ax2 = plt.subplots()
x2 = np.linspace(0, 1, num=3000)
y2 = np.linspace(1, 2, num=3000)
X2, Y2 = np.meshgrid(x2, y2)
points_grid = (x, y)
interfunc_grid = RegularGridInterpolator(points_grid, values, method="linear")
interpolated_values_grid = interfunc_grid(np.column_stack((X2.flatten(), Y2.flatten())))
interpolated_values_grid = interpolated_values_grid.reshape(X2.shape)
d = ax2.contourf(X2, Y2, interpolated_values_grid.T)
fig2.colorbar(d, ax=ax2)
plt.show()

该代码生成两个等值线图:一个用于

LinearNDInterpolator
,另一个用于
RegularGridInterpolator
。这些图显示了更精细网格上的插值。

我是否在代码中的某个地方犯了错误,或者是否还有其他原因导致这两种插值方法的结果会有所不同?任何见解将不胜感激。

python-3.x scipy
1个回答
1
投票

LinearNDInterpolator
基于三角测量(通过 QHull)。每个插值都是三个点的线性组合。对于网格上的数据来说,这三个的选择是退化的。

底线:请勿将

LinearNDinterpolator
用于网格上的数据。

© www.soinside.com 2019 - 2024. All rights reserved.