2017-04-20 5 views
0

こんにちは私は次の問題があります。私はタプルのリストを持っています。各タプルは3D座標で構成されています。すべての座標は別の時間ステップにあります。彼らは本当に近くにあります。リストをマニピュレート/フィルタリングする可能性はありますか?たとえば、距離が1の座標のみが存在します。だから、例えば私がPython:フィルタリストのフィルタ

list1=[(x1,y1,z1),(x2,y2,z2),(x3,y3,z3),(x4,y4,z4),(x5,y5,z5),(x6,y6,z6) 

を持っており、(x1,y1,z1),(x2,y2,z2)(x4,y4,z4),(x5,y5,z5)があまりにも接近しているので、フィルタは

list2=[(x1,y1,z1),(x3,y3,z3),(x4,y4,z4),(x6,y6,z6)], 

を生成します。

+0

リスト内の隣接するタプルを特に指していますが、リスト内の任意のペアは距離1以内にあります。 – roganjosh

+1

また、「親密さ」をどのように定義しますか? – Divakar

+0

あなたはこれを読むことができます:[一番近いペアのアルゴリズム](https://en.wikipedia.org/wiki/Closest_pair_of_points_problem) –

答えて

1

ベクトルセットのサイズが小さいので(< 100)、簡単な解決策が使用できます。次のコードは、既に選択されている既存の代表者に近くない限り、セットから代表を選択します。このコードはパフォーマンスに関しては素朴であり、タプルの順序に敏感です。質問のコメントによれば、それは問題に合うかもしれません。

import numpy as np 
from scipy.spatial.distance import euclidean 

def predicate(representatives, vector): 
    return all(euclidean(representative, vector) >= 1 
       for representative in representatives) 



def main(): 
    vectors = [tuple(l) for l in np.random.random_integers(0, 5, (100, 3))] 

    representatives = set() 
    for vector in vectors: 
     if predicate(representatives, vector): 
      representatives.add(vector) 

私のマシン(i5は6GB)では約100msかかります。

関連する問題