我试图在距离它最近的邻居的单个点处插入函数的值。
我在网格网格[x_grid,y_grid,z_grid] = np.meshgrid(x_range,y_range,z_range)
上指定了f,我希望找到随机点p_rand = (x_rand, y_rand, z_rand)
的近似值。什么是找到最近网格点的索引并插入其值的有效方法?它是3D的 - 最近的立方体或四面体的点都可以。
答案 0 :(得分:3)
扩展@hpaulj和我的评论......你要找的班级是scipy.interpolate.NearestNDInterpolator
此课程基于scipy
自己的scipy.spatial.cKDTree
。 cKDTree
类实现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树的插值器的好处是它的应用程序可以扩展为任意形状的“网格”(不一定是矩形)。
修改强>:
哦,你打算用最近邻居进行线性插值吗?
非常抱歉,我误读了您的问题!
但是,你有两个选择。
如果您的网格足够规则,并且它的结构(起始值/结束值/步骤在所有维度中都知道),那么编写一个定位邻居的函数NearestNDInterpolator
并不难查询点的坐标。然后你做香草线性插值。
如果您的“网格”不是很规则,并且您只有很多研磨点坐标(可能不在矩形格子上),您仍然可以使用n_jobs
来定位{{1最近邻居(可能是findneighbor()
)。之后,您在scipy.spatial.cKDTree
点进行插值。