我在图像中有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
List3= [p for p in List2 if all(cdist(i,p)>20 for i in List1)]
仅对于欧几里德距离,必须从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)
代替使用无效的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
。