Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找距网格位置最近的n个数据点_Python - Fatal编程技术网

Python 查找距网格位置最近的n个数据点

Python 查找距网格位置最近的n个数据点,python,Python,我正在研究一个问题,在三维空间中有一大组(>400万)数据点,每个数据点都有一个标量函数值。这由四个数组表示:XD、YD、ZD和FD。元组(XD[i],YD[i],ZD[i])表示数据点i的位置,其值为FD[i] 我想在和我的数据相同的空间中叠加一个由100x100x100点组成的直线网格。该网格的设置如下所示 [XGrid, YGrid, ZGrid] = np.mgrid[Xmin:Xmax:Xstep, Ymin:Ymax:Ystep, Zmin:Zmax:Zstep] XG = XGri

我正在研究一个问题,在三维空间中有一大组(>400万)数据点,每个数据点都有一个标量函数值。这由四个数组表示:XD、YD、ZD和FD。元组(XD[i],YD[i],ZD[i])表示数据点i的位置,其值为FD[i]

我想在和我的数据相同的空间中叠加一个由100x100x100点组成的直线网格。该网格的设置如下所示

[XGrid, YGrid, ZGrid] = np.mgrid[Xmin:Xmax:Xstep, Ymin:Ymax:Ystep, Zmin:Zmax:Zstep]
XG = XGrid[:,0,0]
YG = YGrid[0,:,0]
ZG = ZGrid[0,0,:]
XGrid是网格中每个点的x值的3D数组。XG是从Xmin到Xmax的x值的1D数组,由XStep的距离分隔

我想使用插值算法,我必须根据周围的数据找到每个网格点的函数值。在这个算法中,我需要20个最接近(或至少接近)我感兴趣的网格点的数据点。也就是说,对于网格点(XG[i],YG[j],ZG[k]),我想找到20个最近的数据点

我能想到的唯一方法是让一个for循环遍历每个数据点,然后让一个后续的嵌入式for循环遍历所有(这么多!)数据点,计算欧几里德距离,并选出20个最接近的数据点

for i in range(0,XG.shape):
  for j in range(0,YG.shape):
    for k in range(0,ZG.shape):

      Distance = np.zeros([XD.shape])

      for a in range(0,XD.shape):
        Distance[a] = (XD[a] - XG[i])**2 + (YD[a] - YG[j])**2 + (ZD[a] - ZG[k])**2

      B = np.zeros([20], int)
      for a in range(0,20):
        indx = np.argmin(Distance)
        B[a] = indx
        Distance[indx] = float(inf)
这将给我一个数组,B,最接近网格点的数据点的索引。我觉得在每个网格点上遍历每个数据点会花费太长时间


我正在寻找任何建议,例如,在计算距离之前如何组织数据点,这样可以减少计算时间。

看看一个看似相似但却是二维的模型,看看你能否从中改进想法


从我的头顶上看,我想你可以根据点的坐标(三个独立的数组)对点进行排序。当您需要距
[X,Y,Z]
网格点最近的点时,您可以快速定位这三个阵列中的点并从那里开始。

此外,您实际上不需要欧几里德距离,因为您只对相对距离感兴趣,也可以将其描述为:

abs(deltaX) + abs(deltaY) + abs(deltaZ)

并且节省了昂贵的功耗和平方根…

无需对每个网格位置的数据点进行迭代:网格位置本身是有序的,因此只需对数据点进行一次迭代,并将每个数据点分配给围绕它的八个网格位置即可。完成后,某些栅格位置的数据点可能太少。检查相邻网格位置的数据点。如果有大量的数据点(这取决于数据的分布方式),您可以在初始过程中选择20个最近的邻居

附录:您可能还需要重新考虑算法的其他部分。你的算法是一种分段线性插值,有很多相对简单的改进。不要把你的空间划分成均匀间隔的立方体,考虑分配一些中心点并动态地重新定位它们,直到从最近的中心点的数据点的平均距离被最小化,例如:
  • 将每个数据点分配到其最近的中心点
  • 将每个中心点重新定位到可以最小化从“其”点(到数据子集的“质心”)的平均距离的坐标
  • 某些数据点现在具有不同的最近中心点。重复步骤1。二,。直到你们会合(或足够接近)

  • 我将首先尝试使用直线网格,然后考虑如何处理您的建议。我已将每个数据点指定给由最近的八个网格点分割的块。现在,我想遍历每个网格点,找到最近的20个数据。对于内部网格点,我可以看到如何执行此操作(搜索周围的八个块并向外搜索),但我不确定如何处理体积边界附近的点。例如,如果我尝试调用周围的八个块,gridpoint(0,0,0)将给出索引超出范围的错误;然后,您只需为每个位置选择最近的20个。一个不太精确的算法是将空间分割成以网格点为中心的立方体(而不是在其拐角处有网格点)。