我正在解决一个问题,我有大量(> 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 值的一维数组,相隔 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,最接近网格点的数据点的索引。我觉得这需要很长时间才能遍历每个网格点的每个数据点。
我正在寻找任何建议,例如如何在计算距离之前组织数据点,这可以减少计算时间。