如何找到最接近网格值的点

How to find closest point to grid values

我正在尝试从函数的最近邻点在单个点处插入函数值。

我在网格 [x_grid,y_grid,z_grid] = np.meshgrid(x_range,y_range,z_range) 上指定了 f,我想为其找到一个随机点的近似值 p_rand = (x_rand, y_rand, z_rand)。找到最近的网格点的索引并对其值进行插值的有效方法是什么?它是 3D 的 - 最近的立方体或点的四面体就可以了。

扩展@hpaulj 和我的评论...您正在寻找的 class 是 scipy.interpolate.NearestNDInterpolator

这个class是基于scipy自己的scipy.spatial.cKDTree. The cKDTree class implements the k-dimensional space-partition tree,或者"k-d tree"数据结构,以构建时间和space换取快速搜索.

要使用 scipy.interpolate.NearestNDInterpolator,您需要初始化一个实例,例如

from scipy.interpolate import NearestNDInterpolator
interpolator = NearestNDInterpolator(your_points, your_values_on_the_points)

创建interpolator后,用

计算random_point处的插值
interpolant = interpolator(random_point)

一旦创建,interpolator 可以重复用于不同的输入点,这是一件好事 (tm)。您还可以通过将所有点传递到调用中来评估多个点的插值。 [1]

如果您查看 source,您会发现插值器是如何使用 cKDTree 实现的。

[1] 实际上有一个潜在的优化:如果你需要对许多点进行 "vectorised" 评估,底层 cKDTreequery() 方法 supports parallelisation,完成于线程中的本机 C 代码 运行。虽然 scipy 自己的 NearestNDInterpolator 实现没有使用这个特性,可能是为了迎合最大公约数,你可以通过制作你自己的 subclass 来覆盖它,它使用合适的并行化n_jobs 参数的选择。

注意:使用基于 k-d 树的插值器的真正好处是它的应用可以扩展到任意形状的 "grid"(不一定是矩形)。


编辑:

哦,所以你打算使用最近邻进行线性插值?

那么非常抱歉,我误解了你的问题

但是,你有两个选择。

  1. 如果你的网格足够规则,并且它的构造(起始值/结束值/你在所有维度上已知的步长),不难写一个函数findneighbor()根据查询点的坐标定位邻居。然后你做香草线性插值。

  2. 如果你的"grid"不是很规则,只是磨点坐标很多(可能不在矩形格子上),你还是可以用scipy.spatial.cKDTree 来定位 N 个最近的邻居(可能是 N = 1 + (dimension of the grid))。在那之后,你在 N 点上进行插值。