虽然 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)