如何找到最接近网格值的点
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" 评估,底层 cKDTree
的 query()
方法 supports parallelisation,完成于线程中的本机 C 代码 运行。虽然 scipy
自己的 NearestNDInterpolator
实现没有使用这个特性,可能是为了迎合最大公约数,你可以通过制作你自己的 subclass 来覆盖它,它使用合适的并行化n_jobs
参数的选择。
注意:使用基于 k-d 树的插值器的真正好处是它的应用可以扩展到任意形状的 "grid"(不一定是矩形)。
编辑:
哦,所以你打算使用最近邻进行线性插值?
那么非常抱歉,我误解了你的问题!
但是,你有两个选择。
如果你的网格足够规则,并且它的构造(起始值/结束值/你在所有维度上已知的步长),不难写一个函数findneighbor()
根据查询点的坐标定位邻居。然后你做香草线性插值。
如果你的"grid"不是很规则,只是磨点坐标很多(可能不在矩形格子上),你还是可以用scipy.spatial.cKDTree
来定位 N
个最近的邻居(可能是 N = 1 + (dimension of the grid)
)。在那之后,你在 N
点上进行插值。
我正在尝试从函数的最近邻点在单个点处插入函数值。
我在网格 [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" 评估,底层 cKDTree
的 query()
方法 supports parallelisation,完成于线程中的本机 C 代码 运行。虽然 scipy
自己的 NearestNDInterpolator
实现没有使用这个特性,可能是为了迎合最大公约数,你可以通过制作你自己的 subclass 来覆盖它,它使用合适的并行化n_jobs
参数的选择。
注意:使用基于 k-d 树的插值器的真正好处是它的应用可以扩展到任意形状的 "grid"(不一定是矩形)。
编辑:
哦,所以你打算使用最近邻进行线性插值?
那么非常抱歉,我误解了你的问题!
但是,你有两个选择。
如果你的网格足够规则,并且它的构造(起始值/结束值/你在所有维度上已知的步长),不难写一个函数
findneighbor()
根据查询点的坐标定位邻居。然后你做香草线性插值。如果你的"grid"不是很规则,只是磨点坐标很多(可能不在矩形格子上),你还是可以用
scipy.spatial.cKDTree
来定位N
个最近的邻居(可能是N = 1 + (dimension of the grid)
)。在那之后,你在N
点上进行插值。