我有一个点列表,我想保留列表中的点,只要它们之间的距离大于某个阈值。因此,从第一点开始,如果第一点和第二点之间的距离小于阈值,那么我将移除第二点,然后计算第一点和第三点之间的距离。如果此距离小于阈值,则比较第一个和第四个点。否则移动到第三和第四之间的距离,依此类推。
例如,如果阈值为2且我有
list = [1, 2, 5, 6, 10]
然后我会期待
new_list = [1, 5, 10]
谢谢!
答案 0 :(得分:1)
不是一个花哨的单行,但你可以迭代列表中的值,如果当前值大于新列表中的最后一个值,则使用[-1]
将其附加到一些新列表:< / p>
lst = range(10)
diff = 3
new = []
for n in lst:
if not new or abs(n - new[-1]) >= diff:
new.append(n)
之后,new
为[0, 3, 6, 9]
。
关于你的评论“如果我有一个坐标列表(x,y)怎么办?”:在这种情况下你会做同样的事情,除了不只是比较数字,你必须找到{{ 3}}两点之间。因此,假设lst
是(x,y)
对的列表:
if not new or ((n[0]-new[-1][0])**2 + (n[1]-new[-1][1])**2)**.5 >= diff:
或者,您可以将(x,y)
对转换为Euclidean distance个数字。对于那些,已经定义了加法,减法和绝对值等基本操作,因此您可以再次使用上面的代码。
lst = [complex(x,y) for x,y in lst]
new = []
for n in lst:
if not new or abs(n - new[-1]) >= diff: # same as in the first version
new.append(n)
print(new)
现在,new
是一个代表点的复数列表:[0j, (3+3j), (6+6j), (9+9j)]
答案 1 :(得分:0)
尽管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)