如何从列表中删除与另一个列表中的点相距一定距离的点

问题描述 投票:1回答:3

我在图像中有2个点的坐标列表。

说,

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,其中我只有List2的坐标,其与List1中所有点的欧式距离大于dist=20

[基本上,我的目标是从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

运行时间:52us

python list filtering coordinates euclidean-distance
3个回答
1
投票
List3= [p for p in List2 if all(cdist(i,p)>20 for i in List1)]

1
投票

仅对于欧几里德距离,必须从euclidean导入scipy.spatial.distance

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)

0
投票

代替使用无效的for循环,可以在NumPy中使用boolean array indexing使用np.all

np.all

请注意,您还可以将Euclidian指标更改为任何其他指标。有关详情,请参见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]]) 。例如,对于曼哈顿距离,可以改写docs on scipy.spatial.distance.cdist

© www.soinside.com 2019 - 2024. All rights reserved.