2016-10-26 17 views
-5
で半径Rと中心Cの球内にある全ての点

問題を入手:たとえば中心Cと半径Rパイソン

球の内部に位置する全ての点は、以下の画像を探しますこれは単純な2Dの場合の問題点を説明しています。各点のラベル(N)と座標(x、y)は既知である。私が見つける必要がある7.25 M点の座標を含むすべてのポイントの赤い円の中にあるラベル

enter image description here

サンプル入力ファイルはpoint fileここに装着されています。

私はそれをより速く作るために何か提案コード

import numpy as np 

C = [50,50,50] 

R = 20 

centroid = np.loadtxt('centroid') #chk the file attached 

def dist(x,y): return sum([(xi-yi)**2 for xi, yi in zip(x,y)]) 

elabels=[i+1 for i in range(len(centroid)) if dist(C,centroid[i])<=R**2] 

の以下の部分を試してみましたか?

おかげで、 Prithivi

+1

3次元格子点では、3重に入れ子にされたリストやその他のデータ構造を意味しますか。 –

+0

質問で説明しようとします。 – Mechanician

+1

あなたはその質問を説明できませんでした。 3Dグリッドがどのデータ構造で表現されているかが問題です。 – HuStmpHrrr

答えて

1

いいえ、これを行うには組み込み関数がありません。しかし、構文を簡潔にするための構文があります。幾何学的なパッケージには、データ型が含まれていますが、距離関数のサポートだけでなく、役立つこともあります。

あなたが選択したセットアップコードを見ることなく、およそ私が提供できるすべてはこのようなものである。このような構成にアプローチする

neighbours = [point for point in point_list if dist(C, point) < R] 

もう一つの方法は、点にフィルタ方法を使用することです list;あなたは構造の類似点に気付くでしょう。

をコメントに


応答は、セットアップ編集した問題のようです:ポイントを定期的に離間されていますか?その場合は、リストCを完全に削除し、いくつかのパラメータを使用してネイバーを単純に計算します。ポイントが不安定に分散されている場合は、各ポイントに近い近隣のグラフを作成することでスピードアップを図ることができます。次に、距離に基づくグラフトラバーサルアルゴリズムを使用して、毎回近傍検索を実行するよりもはるかに迅速に近くの点を集めることができます。


シンプル志向の挿入

あなたは各ポイントを読んで、あなたが行くように地域を構築し、あなたのグラフ内の既存のポイントに対してそれを確認してください。何よりも、武器として三角不等式を使用してください。例えば、現在のポイント場合Xには点はの近隣の近隣Xになることはできません '次いで、点から少なくとも2個の* m個の単位です。

希望する場合は、グラフ内の領域間に長距離リンクをいくつか維持することもできます。これにより、遠く離れた近隣を検索から除外することができます。あなたは、Dを計算する場合、一般に、(X)、その後、この範囲は2 * mを含まない場合をqおよびd(a、b)は、次いで

|q-r| <= d(x,b) <= q+r 

Rであるとすることが同様に近所の人々を排除することができます。bの近所全体。

+0

ありがとう!上記のように実装しました。それをより速くする方法はありますか? – Mechanician

+0

お返事ありがとうございます。私の実際の問題では、ポイントは定期的に配置されていません。私はあなたが言及した距離ベースのグラフトラバーサルアルゴリズムを認識していません。それを私に説明したり、情報を含むリンクを共有したりできますか?現在のコードは約10分かかります。 – Mechanician

+0

距離ベースの単一アルゴリズムはありません。私はあなたがポイントを収集するようにグラフを構築することをお勧めします。それぞれの新しいポイントは、あなたが行くようにグラフのエッジを更新する、例えば、5つの最も近いポイントにリンクされます。距離情報を使って検索を大幅に減らすことができます。 – Prune