如何在一个列表中移除与另一个列表中点距离较近的点
我有两个列表,里面是图像中点的坐标。
比如,
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=20
的 List2
中的坐标。
简单来说,我的目标是把 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 个回答
与其使用效率低下的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')
。
要计算欧几里得距离,你需要从 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)
好的,下面是你需要的内容:
在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个水桶倒到另一个水桶里。我们需要确保水不会洒出来,也就是确保数据在转移过程中不会丢失或出错。
为了做到这一点,程序员会使用一些工具和方法来帮助他们管理这些数据。比如,有些程序会使用“变量”来存储数据,变量就像是一个可以装东西的盒子。你可以把水(数据)放进盒子里,然后在需要的时候再拿出来。
此外,程序员还会使用“函数”来处理数据。函数就像是一个机器,你把水放进去,机器会帮你处理这些水,然后再把处理好的水倒出来。这样可以让程序更加整洁,也更容易理解。
总之,处理数据就像是在厨房里做饭,需要用到不同的工具和方法,才能把食材变成美味的菜肴。
List3= [p for p in List2 if all(cdist(i,p)>20 for i in List1)]