【问题标题】:Python: Compare distance between entries in a list and replace an entry if the distance is less than a specific number?Python:比较列表中条目之间的距离并在距离小于特定数字时替换条目?
【发布时间】:2018-05-01 10:34:17
【问题描述】:

我生成了一个如下的随机列表,其中每个条目对应于 x,y,z 坐标。然后我比较每个条目之间的距离如下:

myList = []
for x in range(12): #12 is just an example number, just a multiple of 3
    myList.append(random.uniform(0,1))
#Split list into x,y,z coordinates
n = 3
newList = [myList[i:i + n] for i in xrange(0, len(myList), n)]

#function to get distance
def distance(p1, p2):
    myDist = math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2)
    return myDist

#Compare distance between each entry in newList
for a,b in itertools.combinations(newList, 2):
    distance(a,b)

我的问题是:

如果距离(a,b)i,其中 i 是某个数字,我想用新条目替换 a 和/或 b,以使距离大于 i。最后,我想要一个列表,使得任意两点之间的距离都大于 i。我正在考虑在这里添加一个 if 语句:

#Compare distance between each entry in newList
i = 0.4 #can be any number
for a,b in itertools.combinations(newList, 2):
    distance(a,b)
    if distance(a,b) < i:
        #replace a and/or b

但是,我认为我需要再次迭代 newList 以确保生成的新点都不在其他点的 i 距离内,并继续这样做,直到所有点的距离都大于 i 距离。有没有一种巧妙的方法来做到这一点?谢谢!

【问题讨论】:

  • 迭代的顺序会影响你的最终答案。这是故意的吗?
  • 好吧,我的最终目标是得到一堆条目/点,其中没有一个点的距离小于 i。秩序还会影响这里的事情吗?

标签: python combinations distance itertools


【解决方案1】:

但是,我认为我需要再次迭代 newList 以确保生成的新点都不在其他点的 i 距离内,并继续这样做,直到所有点的距离都大于 i 距离。有没有一种巧妙的方法来做到这一点?谢谢!

有更简洁的方法可以做到这一点,但它们都涉及使用平衡树结构来执行二维碰撞检测,而不是检查每个点,因此检查新点是否有效只需要 log(n) 时间而不是 n。

您可以避免生成完整的原始列表;一次生成一个点,验证它们,然后将它们添加到(最初为空的)列表中会稍微快一些。

【讨论】:

  • 我明白了 - 所以看起来最好一次生成一个点,检查这个新点与所有先前点的距离,然后将其添加到列表中,如果距离大于 i。目标是最终得到一堆条目/点,其中没有一个点的距离小于 i 距离。
猜你喜欢
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 2018-07-09
相关资源
最近更新 更多