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

时间:2015-09-15 19:50:25

标签: python numpy interpolation

我试图在距离它最近的邻居的单个点处插入函数的值。

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

1 个答案:

答案 0 :(得分:3)

扩展@hpaulj和我的评论......你要找的班级是scipy.interpolate.NearestNDInterpolator

此课程基于scipy自己的scipy.spatial.cKDTreecKDTree类实现k-dimensional space-partition tree或“k-d树”数据结构,用于交换构造时间和空间以进行快速搜索。

要使用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]实际上有一个潜在的优化:如果你需要针对很多点的“矢量化”评估,那么基础cKDTree的{​​{1}}方法supports parallelisation,在本机C代码中运行在线程中。虽然query()自己的scipy实现不使用此功能,可能适用于最大公约数,但您可以通过创建自己的子类来使用并行化,并选择合适的{{1}来覆盖它。参数。

注意:使用基于k-d树的插值器的好处是它的应用程序可以扩展为任意形状的“网格”(不一定是矩形)。

修改

哦,你打算用最近邻居进行线性插值吗?

非常抱歉,我误读了您的问题

但是,你有两个选择。

  1. 如果您的网格足够规则,并且它的结构(起始值/结束值/步骤在所有维度中都知道),那么编写一个定位邻居的函数NearestNDInterpolator并不难查询点的坐标。然后你做香草线性插值。

  2. 如果您的“网格”不是很规则,并且您只有很多研磨点坐标(可能不在矩形格子上),您仍然可以使用n_jobs来定位{{1最近邻居(可能是findneighbor())。之后,您在scipy.spatial.cKDTree点进行插值。