我有一个字符,其坐标为键。它们默认为3维,如dictionary[(x,y,z)]=values
,但可能在任何维度,因此代码不能硬编码为3。
我需要找到新坐标的某个半径内是否还有其他值,理想情况下我需要这样做,而不必导入任何插件,如numpy。
我最初的想法是将输入分成一个立方体并检查没有点匹配,但显然这仅限于整数坐标,并且会以指数方式增长(半径为5将需要729倍处理),并且使用我的初始代码至少花一分钟来获得相对较小的价值,我真的无法承受这一点。
我听说找到最近的邻居可能是最好的方法,理想情况下,减少用于+一定范围的键 - 一定数量会很好,但我不知道你是怎么做的更多的是使用的一点。
这就是我如何用我目前的知识来做到这一点:
dimensions = 3
minimumDistance = 0.9
#example dictionary + input
dictionary[(0,0,0)]=[]
dictionary[(0,0,1)]=[]
keyToAdd = [0,1,1]
closestMatch = 2**1000
tooClose = False
for keys in dictionary:
#calculate distance to new point
originalCoordinates = str(split( dictionary[keys], "," ) ).replace("(","").replace(")","")
for i in range(dimensions):
distanceToPoint = #do pythagors with originalCoordinates and keyToAdd
#if you want the overall closest match
if distanceToPoint < closestMatch:
closestMatch = distanceToPoint
#if you want to just check it's not within that radius
if distanceToPoint < minimumDistance:
tooClose = True
break
但是,以这种方式执行计算可能仍然会非常慢(它必须对数百万个值执行此操作)。我已经搜索了这个问题,但大多数人似乎都有更简单的数据集来实现这一目标。如果有人可以提供任何提示,我将不胜感激。
答案 0 :(得分:1)
您说您需要确定在特定点的给定半径内是否存在任何键。因此,您只需要扫描按键,计算每个按键的距离,直到找到指定半径范围内的按键。 (如果你对半径的 square 进行比较,你可以避免实际距离所需的平方根。)
一个优化方法是根据他们的&#34;曼哈顿距离&#34;对键进行排序。从这一点(即添加组件偏移),因为欧几里德距离永远不会小于此。这可以避免一些更昂贵的计算(虽然我认为你不需要和三角学)。
如果你在问题的后面提出建议,你需要处理多个点,你可以显然单独处理每个点,或者你可以找到这些点的中心并根据它进行排序。