我已经玩了几天了,并且继续遇到表演墙。
数据:
结构:
我在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中),但我找不到。
答案 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内部,它确实应该更快。另外,这是一个问题,问题是你的问题。