2013-03-18 54 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)中的錯誤。