web-dev-qa-db-ja.com

最近傍検索:Python

私は2次元配列を持っています:

MyArray = array([6588252.24, 1933573.3, 212.79, 0, 0],
                [6588253.79, 1933602.89, 212.66, 0, 0],
                 etc...)

最初の2つの要素MyArray[0]およびMyArray[1][〜#〜] x [〜#〜][〜#〜] y [ 〜#〜]ポイントの座標。

配列内のすべての要素について、半径が[〜#〜] x [〜#の単一の最近傍を返す最速方法を見つけたいと思います〜]単位。これは2D空間にあると想定しています。

この例ではX = 6

すべての要素を他のすべての要素と比較することで問題を解決しましたが、リストが22kポイントの長さの場合、これには15分ほどかかります。最終的には、これを約3,000万ポイントのリストで実行したいと考えています。

私はK-dツリーについて読んで基本的な概念を理解しましたが、それらをスクリプト化する方法を理解するのに苦労しました。

23
Dlinet

Scipyを提案してくれたJohn Vinyardに感謝します。いくつかの良い研究とテストの後、これがこの質問の解決策です:

前提条件:NumpyとSciPyをインストールする

  1. SciPyおよびNumpyモジュールをインポートする

  2. X値とY値をjustを含む5次元配列のコピーを作成します。

  3. cKDTree のインスタンスを次のように作成します。

    YourTreeName = scipy.spatial.cKDTree(YourArray, leafsize=100)
    #Play with the leafsize to get the fastest result for your dataset
    
  4. cKDTreeに、6ユニット以内の最近傍のクエリを実行します。

    for item in YourArray:
        TheResult = YourTreeName.query(item, k=1, distance_upper_bound=6)
    

    YourArrayの各アイテムの場合、TheResultは2つのポイント間の距離のタプル、およびYourArrayのポイントの場所のインデックスになります。

30
Dlinet