我正在尝试使用SciPy的LinearNDInterpolator
和RegularGridInterpolator
函数对1D、2D和3D数据进行线性插值。
据我所知,这两种方法的主要区别在于RegularGridInterpolator
f被设计用来处理间距均匀或不均匀的直线(或“规则”)网格上的数据。与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
。这些图显示了更精细网格上的插值。
我是在代码中的某个地方出错了吗?还是这两种插值方法的结果不同有其他原因?如有任何见解,将不胜感激。
1条答案
按热度按时间az31mfrm1#
LinearNDIb插补器基于三角剖分(通过QHull)。每个插值都是正好三个点的线性组合。而这三种选择对于网格上的数据是退化的。
底线是:不要对网格上的数据使用LinearNDinterpolator。