给定python中的阈值,有效地删除彼此接近的数组

我正在使用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树使其更高效,但这需要一些更高级的数据结构.

上一篇:从具有重复值的MySQL结果创建多维嵌套数组(PHP)


下一篇:php – 删除重复项并在一个语句中更新一个唯一的左侧?