Scipy.Spatial.KDTree.query - 大型数据集问题

时间:2013-03-18 17:10:53

标签: python scipy spatial kdtree

我正在使用SciPy.Spatial中的KDQuery函数。一旦我的数据量变得非常大,我就会遇到问题。我意识到该算法不一定能够有效地用于大型数据集,但它(从源头)看来,大小应该只增加处理时间,而不是影响输出。

以下是代码段:

sizes = [ 10**i for i in range(5,6) ] #10^5 for this test
data = np.random.random_integers(0,100,(sizes[-1],2))
for size in sizes:
    kd = ps.common.KDTree(data)
    nnq = kd.query(data,k=2+1, p=2)
    info = nnq[1] #This is the indices of the neighbors
    neighbors = {}
    idset = np.arange(len(info)) #Indices of the input point
    for i, row in enumerate(info):
        row = row.tolist()
        row.remove(i)
        neighbors[idset[i]] = list(row)

当i不在列表中时,返回值错误(ValueError list.remove(x):x not in list)。对于小于10 ^ 5的数据大小,此代码按预期工作。

错误的一个潜在原因是正在达到递归限制。为了探索这一点,我将递归深度设置为1,000,000(sys.setrecursionlimit(1000000))。这并没有缓解这个问题。

1 个答案:

答案 0 :(得分:1)

错误发生在您的代码中,位于row.remove(i)语句处。问题是您的随机数据集可能有重复的点,有时相同的点可以重复三次以上。当数据集很大时,这很可能发生。当发生这种情况时,一个点的三个最近邻居可能不包括该点本身。这导致row.remove(i)中的错误。