在3D空间中有效地沿特定轴找到最近点

时间:2012-03-20 13:43:07

标签: python spatial

我已经玩了几天了,并且继续遇到表演墙。

数据:

  • 10s到数十万个3D点
  • 点为正/负int并且落在没有重叠的3D网格上
  • 很少添加新点
  • 通常是无间隙但可能存在差距

结构:

  • 必须能够有效地找到沿每个轴的最近邻居(“最靠近左侧”)和该轴。
  • 很少在施工后处理插入或删除(但必须处理它们)
  • 不需要处理重叠点

我在http://docs.scipy.org/doc/scipy/reference/spatial.html找到了一个可能的解决方案,但是K-d树对于这种类型的数据(对于任意点的簇更合适)并且针对在半径内寻找点进行调整似乎非常浪费。此数据的主要用例通常是沿着每个数据找到(和跟随)最近的邻居点。

示例数据(x,y,z):

[(4, 3, 0), (4, 4, 0), (5, 3, 0), (3, 3, 0), (4, 3, 1), ...]

可能我的google-fu失败了,并且已经存在最佳结构(最好是在Python中),但我找不到。

3 个答案:

答案 0 :(得分:3)

如何分别为x,y,z轴构建3个KD树? 无论如何,你需要某种树形结构。

答案 1 :(得分:0)

嗯,发现“离左边最近”并且因为你在x = 4上说了多个点,所以会发现很棘手,然后需要找到其他轴上的闭合点。

如下所示,更简单的“最近点”会不起作用?

for n in xrange(len(points)):
   diff = (((x0-points.x[n])**2) + ((y0-points.y[n])**2) + ((z0-points.z[n])**2))**0.5

然后用最小的差异清除'n'(如果包括当前点除外)..:/

答案 2 :(得分:0)

如果只有点跟随轴并且其他轴的值为静态,则只计算为最近的点,例如(1,1,0)不符合最接近(0,0,0)的条件,但是(4,0,0)你可以:

import numpy as np
#The .T is ofcourse not neccesary here but then you have to fix it below as well.
points = np.asarray( [(4, 3, 0), (4, 4, 0), (5, 3, 0), (3, 3, 0), (4, 3, 1)]).T
#You have still to check thiss for all points just showing for pt 0
on_same_xy = (points[:-1,:].T == points[:-1,0]).all(axis=1)

z_distance =  (points[2,on_same_xy] - points[2,0])
z_distance_up = z_distance[np.where(z_distance > 0)]
if z_distance_up.size == 0:
    up = None
else:
    up = z_distance_up.min()

z_distance_down = z_distance[np.where(z_distance < 0)]
if z_distance_down.size == 0:
    down = None
else:
    down = z_distance_down.max()

print "Z-up-neighbour %s, Z-down-neighbour %s" % (str(up), str(down))

由于您只有点[-1,0]的两个第一个坐标值,因此可以从上到下访问上点和下点的位置以及距离。

我意识到代码有点混乱,但是一旦大数据集在nunpy内部,它确实应该更快。另外,这是一个问题,问题是你的问题。