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 つは、再帰の制限に達したことです。これを調べるために、再帰の深さを 1,000,000 に設定しました ( sys.setrecursionlimit(1000000)
)。これは問題を軽減しません。