Python 在散乱数据中寻找最近点

Python 在散乱数据中寻找最近点,python,numpy,scipy,interpolation,bilinear-interpolation,Python,Numpy,Scipy,Interpolation,Bilinear Interpolation,我正在努力提高使用gridfit插值的大型数据集的插值速度。我已经发布了一个关于stackoverflow的帖子,但还没有得到回复 所以,我想尝试一些替代品。我的想法是,如果我有一个巨大的数据集,如下面的Python代码片段所示 arr_len = 932826 xi = np.random.uniform(low=0, high=4496, size=arr_len) yi = np.random.uniform(low=-74, high=492, size=arr_len) zi = np

我正在努力提高使用gridfit插值的大型数据集的插值速度。我已经发布了一个关于stackoverflow的帖子,但还没有得到回复

所以,我想尝试一些替代品。我的想法是,如果我有一个巨大的数据集,如下面的Python代码片段所示

arr_len = 932826
xi = np.random.uniform(low=0, high=4496, size=arr_len)
yi = np.random.uniform(low=-74, high=492, size=arr_len)
zi = np.random.uniform(low=-30, high=97, size=arr_len)
我必须插值并得到定义点的值,比如(x,y)。从散列数据席、彝、子中找到4个相邻点的最快方法,可以使用In Pd(参见下面的图像)进行双线性插值。我不知道这是否会比使用gridata更快地得到结果,但最好尝试一下


我想你想的基本上是最近邻回归。以下是如何使用scikit learn实现这一点。请注意,考虑的邻居数4是一个任意选择,因此您也可以尝试其他值

将numpy导入为np
从sklearn.com导入Kneighbors回归器
arr_len=932826
np.随机种子(42)
席= NP,随机。一致(低= 0,高= 4496,大小= ARRYLLN)
yi=np.random.uniform(低=74,高=492,大小=arr_len)
zi=np.随机.均匀(低=30,高=97,大小=arr_len)
#获取z值的点(例如):
x_new=[1005002000]
y_new=[400300100]
#在机器学习表示法中:
X_train=np.vstack([xi,yi]).T
y_train=zi
X_predict=np.vstack([X_new,y_new]).T
#将4-最近邻回归器拟合到训练数据
neigh=Kneighbors回归器(n_近邻=4)
neigh.fit(X_列车,y_列车)
#获取“插值”z值
打印(neigh.predict(X_predict))

我想你可以把那些
xi
yi
zi
传给
interp2d
?“x,y和z是用于近似某个函数f:z=f(x,y)的值数组。该类返回一个函数,其调用方法使用样条插值来查找新点的值。”@AKX:我尝试过,但interp2d无法处理如此大的数据集,所以想考虑一下备选方案Show是否定义了“4个相邻点”?具体来说,在图片中,如果X1是小于x的所有席的最大值,Y1是小于Y的所有彝族的最大值,那么X1和Y1不一定属于数据集中的同一点,对吗?所以你可能不知道Q11的z值。或者我遗漏了什么?也许你想做的基本上是最近邻回归?如果是这样,您可以使用scikit learn:@Arne:是的,您是对的,如果我们按照您的定义进行搜索,那么我们可能会得到离散点,这可能不会给出Q11。我当时的想法是将该区域划分为4个象限,然后搜索象限中的所有点。然后根据距离x,y的距离对最近的点进行排序,以获得唯一的数字。但随后它也感觉到了计算密集!非常感谢你优雅的态度。学习一种新方法真的很好我的一个问题是,在某些区域中不存在任何数据,但由于它使用最近的,所以无论如何它会用一些数据填充它。我怎样才能避免呢?例如,如果在x+/-x1和y+/-y1范围内不存在任何数据,那么是否有任何方法拒绝这些点的计算值,而是使用NaN。我知道我可以手动操作,但我想知道它是否可以直接在代码中处理我还发现,由于我的数据集非常密集,使用gridfit和“最近”选项可以提供几乎类似的结果,就像我使用“线性”插值一样,而且速度也非常快,因为它只需要取最近的值,你能告诉我,当它检查最近的数据时,它会查看探测点周围的数据吗?例如,如果我们在给定点周围的四个象限中定义数据,它会在预测值之前查看所有四个象限,还是只查看4个最近点,或x个最近点(取决于我们在邻域中指定的数量),以避免预测空区域,您可以使用
radiunighborsregrestor
而不是
kneighborsregreservator
。它将使用指定半径内的所有点进行预测,如果没有,它将输出
NaN
。请参阅:正如我在上面编写的代码一样,4个最近邻用于预测,其中“最近”是指根据欧几里得距离。但是您也可以通过指定
metric
参数来选择其他度量。见:
[39.37712018  4.36600728 47.00192216]