2013-03-18 52 views
0

我在玩SciPy.Spatial中的KDQuery函数。一旦我的数据量变得非常大,我就会遇到问题。我意识到该算法不一定适用于大型数据集,但它(从源头上看)大小应该只会增加处理时间,而不会影响输出。Scipy.Spatial.KDTree.query - 大型数据集问题

这里是一个代码段:

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不)。对于小于10^5的数据,此代码按预期工作。

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

+0

什么是'ps.common'命名空间? – 2013-03-19 15:49:09

+0

只是处理模块级别导入的另一个文件 – Jzl5325 2013-03-19 21:12:58

回答

1

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