首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果两点之间的距离低于某个阈值,则从列表中删除点

如果两点之间的距离低于某个阈值,则从列表中删除点
EN

Stack Overflow用户
提问于 2017-08-05 05:29:54
回答 1查看 1.9K关注 0票数 2

我有一个点的列表,只有当它们之间的距离大于某个阈值时,我才想保留列表中的点。所以,从第一个点开始,如果第一个点和第二个点之间的距离小于阈值,那么我就去掉第二个点,然后计算第一个点和第三个点之间的距离。如果此距离小于阈值,请比较第一个点和第四个点。否则移动到第三个和第四个之间的距离,依此类推。

举个例子,如果阈值是2,我有

list = [1, 2, 5, 6, 10]

那我就会期望

new_list = [1, 5, 10]

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-07-09 18:06:51

虽然tobias_k的解决方案有效,但它不是最有效的(在我看来,但我可能忽略了一些东西)。它是基于列表顺序的,并且不认为与其他元素的最大数量接近(在阈值内)的元素应该在解决方案中的最后一个元素中删除。应该首先考虑和检查具有最少数量的此类连接(或接近)的元素。我建议的方法可能会允许从给定列表中的其他元素保留指定阈值之外的最大点数。这对于向量列表以及x,y或x,y,z坐标都非常有效。但是,如果您打算将此解决方案与标量列表一起使用,则只需在代码orig_list=np.array(orig_list)[:,np.newaxis].tolist()中包含此行即可

请参考下面的解决方案:

import numpy as np

thresh = 2.0

orig_list=[[1,2], [5,6], ...]

nsamp = len(orig_list)
arr_matrix = np.array(orig_list)
distance_matrix = np.zeros([nsamp, nsamp], dtype=np.float)

for ii in range(nsamp):
    distance_matrix[:, ii] = np.apply_along_axis(lambda x: np.linalg.norm(np.array(x)-np.array(arr_matrix[ii, :])),
                                                              1,
                                                              arr_matrix)


n_proxim = np.apply_along_axis(lambda x: np.count_nonzero(x < thresh),
                               0,
                               distance_matrix)

idx = np.argsort(n_proxim).tolist()
idx_out = list()

for ii in idx:
    for jj in range(ii+1):
        if ii not in idx_out:
            if self.distance_matrix[ii, jj] < thresh:
                if ii != jj:
                    idx_out.append(jj)

pop_idx = sorted(np.unique(idx_out).tolist(),
                 reverse=True)

for pop_id in pop_idx:
    orig_list.pop(pop_id)

nsamp = len(orig_list)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45515764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档