如何在一个列表中移除与另一个列表中点距离较近的点

1 投票
3 回答
4290 浏览
提问于 2025-04-19 18:43

我有两个列表,里面是图像中点的坐标。

比如,

List1 = [[2,3],[4,5],[10,20],[45,60]]
List2 = [[100,50],[65,48],[58,32],[98,45]...............[655,254],[232,545]]

dist = 20

List1 里可能有5到6个元素,而 List2 里可能有超过1000个元素。

我想生成一个 list3,这个列表里只包含那些与 List1 中所有点的欧几里得距离超过 dist=20List2 中的坐标。

简单来说,我的目标是把 List2 中那些离 List1 中点比较近的点去掉。

现在,我的做法是这样的:

from scipy.spatial.distance import cdist

def newlist(list1, list2, dist):
    edist = cdist(list2, list1)
    highvalues = edist > dist
    edist[highvalues] = 0
    edist[~highvalues] = 1
    indx = edist.sum(axis=1)
    list3 = [list2[i] for i, e in enumerate(indx) if e == 0]

    return list3

运行时间:52微秒

3 个回答

1

与其使用效率低下的for循环,不如在NumPy中使用布尔数组索引,配合np.all来处理数据。

import numpy as np
from scipy.spatial.distance import cdist

points = np.array([[0,1], [2,0], [4,5], [6,7], [9,9], [8,10]])
reference = np.array([[0,0], [10,10]])
distance = 3

filtered_points = points[np.all(cdist(points, reference) >= distance, axis=1)]
print(filtered_points)
# array([[4, 5],
#        [6, 7]])

另外,你也可以把欧几里得距离换成其他类型的距离。想了解更多,可以查看关于scipy.spatial.distance.cdist的文档。比如,如果你想计算曼哈顿距离,可以这样写:cdist(points, reference, metric='cityblock')

1

要计算欧几里得距离,你需要从 scipy.spatial.distance 导入 euclidean

from scipy.spatial.distance import euclidean
new_list=[]
for i in List2:
    for j in List1:
        if euclidean(i,j)>20:
            continue        
    new_list.append(i)
2

好的,下面是你需要的内容:

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个水桶倒到另一个水桶里。我们需要确保水不会洒出来,也就是确保数据在转移过程中不会丢失或出错。

为了做到这一点,程序员会使用一些工具和方法来帮助他们管理这些数据。比如,有些程序会使用“变量”来存储数据,变量就像是一个可以装东西的盒子。你可以把水(数据)放进盒子里,然后在需要的时候再拿出来。

此外,程序员还会使用“函数”来处理数据。函数就像是一个机器,你把水放进去,机器会帮你处理这些水,然后再把处理好的水倒出来。这样可以让程序更加整洁,也更容易理解。

总之,处理数据就像是在厨房里做饭,需要用到不同的工具和方法,才能把食材变成美味的菜肴。

List3= [p for p in List2 if all(cdist(i,p)>20 for i in List1)]

撰写回答