如何在二维非规则网格数据中对指定切片进行插值?
解决方案:针对指定散点的非规则网格插值
可以用scipy.interpolate里的LinearNDInterpolator或者NearestNDInterpolator,这两个工具专门处理散点插值,不需要生成整个新网格,只需要对你指定的少量点计算插值结果,完全符合你的需求。
具体实现步骤:
- 把原非规则网格的所有点和对应的
psi值转换成一维散点集合(不管原网格是规则还是非规则,这一步都通用); - 初始化插值器,传入散点坐标和对应的
psi值; - 直接用插值器计算目标点(
x_points和y_points)的插值结果。
修改后的完整代码:
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import LinearNDInterpolator # 原网格数据(这里示例是规则网格,换成你的非规则网格也一样) x = np.linspace(-50,50,100) y = np.linspace(400,500,100) X, Y = np.meshgrid(x,y) Vec = np.array([X, Y]) psi = 90 - np.rad2deg(np.arccos(Vec[0,:,:] / np.linalg.norm(Vec, axis=0))) R = np.sqrt(X ** 2 + Y ** 2) # 目标插值点 x_points = np.linspace(x.min(), x.max()) y_points = [480] * len(x_points) target_points = np.column_stack((x_points, y_points)) # 转换原网格为散点集 scatter_x = X.flatten() scatter_y = Y.flatten() scatter_psi = psi.flatten() # 初始化线性插值器(换成NearestNDInterpolator就是最近邻插值) interpolator = LinearNDInterpolator((scatter_x, scatter_y), scatter_psi) # 计算目标点的插值结果 psi_interp = interpolator(target_points) # 可视化验证 fig, ax = plt.subplots() contour = ax.contourf(X, R, psi, levels=20) ax.plot(x_points, y_points, color='blue', label='插值切片') # 把插值结果画出来对比 ax.scatter(x_points, y_points, c=psi_interp, cmap=contour.cmap, vmin=psi.min(), vmax=psi.max(), label='插值结果') plt.colorbar(contour, ax=ax) ax.legend() plt.show()
为什么这个方法适合你:
- 不需要生成整个新网格,只计算你指定的少量目标点,计算成本极低;
- 完全支持非规则网格数据,只要你能提供所有网格点的坐标和对应的
psi值即可; - 可以选择不同的插值方式:线性插值(
LinearNDInterpolator)适合平滑过渡,最近邻插值(NearestNDInterpolator)适合保留原始数据的阶跃特征。
如果你的非规则网格数据本身就是散点形式(不是meshgrid生成的),直接用散点坐标初始化插值器就行,不需要flatten步骤。
内容的提问来源于stack exchange,提问作者A. Heintz
相关产品推荐
相关产品推荐

