我正在使用python来完成这项工作并且在这里非常客观,我想找到一种’pythonic’方法从数组中删除与阈值相互接近的“重复”.例如,给这个数组:
[[ 5.024, 1.559, 0.281], [ 6.198, 4.827, 1.653], [ 6.199, 4.828, 1.653]]
观察到[6.198,4.827,1.653]和[6.199,4.828,1.653]彼此非常接近,它们的欧几里德距离是0.0014,所以它们几乎是“重复”,我希望我的最终输出只是:
[[ 5.024, 1.559, 0.281], [ 6.198, 4.827, 1.653]]
我现在的算法是:
to_delete = [];
for i in unique_cluster_centers:
for ii in unique_cluster_centers:
if i == ii:
pass;
elif np.linalg.norm(np.array(i) - np.array(ii)) <= self.tolerance:
to_delete.append(ii);
break;
for i in to_delete:
try:
uniques.remove(i);
except:
pass;
但它真的很慢,我想知道一些更快和’pythonic’的方法来解决这个问题.我的容忍度是0.0001.
解决方法:
通用方法可能是:
def filter_quadratic(data,condition):
result = []
for element in data:
if all(condition(element,other) for other in result):
result.append(element)
return result
这是具有条件的通用高阶滤波器.仅当满足列表*中已有的所有元素的条件时,才添加该元素.
现在我们仍然需要定义条件:
def the_condition(xs,ys):
# working with squares, 2.5e-05 is 0.005*0.005
return sum((x-y)*(x-y) for x,y in zip(xs,ys)) > 2.5e-05
这给出了:
>>> filter_quadratic([[ 5.024, 1.559, 0.281], [ 6.198, 4.827, 1.653], [ 6.199, 4.828, 1.653]],the_condition)
[[5.024, 1.559, 0.281], [6.198, 4.827, 1.653]]
该算法在O(n2)中运行,其中n是您为函数提供的元素数.但是,您可以使用k-d树使其更高效,但这需要一些更高级的数据结构.