我有一个点的列表,只有当它们之间的距离大于某个阈值时,我才想保留列表中的点。所以,从第一个点开始,如果第一个点和第二个点之间的距离小于阈值,那么我就去掉第二个点,然后计算第一个点和第三个点之间的距离。如果此距离小于阈值,请比较第一个点和第四个点。否则移动到第三个和第四个之间的距离,依此类推。
举个例子,如果阈值是2,我有
list = [1, 2, 5, 6, 10]
那我就会期望
new_list = [1, 5, 10]
谢谢!
发布于 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)
https://stackoverflow.com/questions/45515764
复制相似问题