n维

时间:2017-04-11 17:13:56

标签: python algorithm python-2.7 closest-points

python中是否有任何高效的库函数可以找到最接近/最远的一对点? 输入是位于边缘大小为1的k维立方体中的点列表。 为了找到最接近的代码,以下代码占用了太多时间。 TC:O(n ** 2 * k)其中n是输入的大小。 在我的例子中,输入n约为4000,k的值约为300。

def euclid_dist( p1, p2 ):
    val = 0
    for i in range(len(p1)):
        val += (p1[i]-p2[i])**2
    return val

def find_close_cluster( points ):
    ans1 = 0
    ans2 = 1
    min_dist = 1000000000000
    for i in range( len(clusters) ):
        for j in range( i+1,len(clusters)):
            current_dist = euclid_dist(clusters[i],clusters[j])
            if( current_dist < min_dist ):
                ans1 = i
                ans2 = j
                min_dist = current_dist
    return ( ans1, ans2 )

1 个答案:

答案 0 :(得分:2)

您应该使用numpy ndarraysscipy.spatial.distance.cdist功能。 numpy为您提供了一个以向量化形式处理数据的高效容器,因此代码运行速度比在迭代器或列表上执行循环要快得多。 scipy.spatial.distance.cdist使用numpy数组来计算所有元素之间的距离。有关详细信息,请查看documentation。 下面的代码应该有效:

import numpy as np
from scipy.spatial.distance import cdist

your_data = np.asarray([[first_sample], [second_sample], [...])
d = cdist(your_data, your_data)
number_samples = your_data.shape[0]
# Select d(a_i,a_j), i != j without repetitions
il1 = np.tril_indices(number_samples, k=-1) 
dist = d[il1]
arg_min = dist.argmin()
min = dist.min()
arg_max = dist.argmax()
max = dist.max()