2016-10-28 10 views
1

たとえば、単純な2Dの場合の問題点を説明する下の画像を見てください。各点のラベル(N)と座標(x、y)は既知である。私は球状領域にあるすべての点を終えてください

私の実際の問題が3Dである赤色の円内にあるすべてのポイントラベルを見つける必要があるとの点は一様に7.25 M点の座標を含んで

enter image description here

サンプル入力ファイルを配布されていませんこちらはpoint fileです。

私はそれは〜10分かかり、単一の検索のためのコード

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

+0

Pythonのブール値のインデックスを使用することができますすべての行をマシンコードにそれが打ち上げだたびに変換されていることを意味スクリプト言語です。 C、Java、Pascal、...のようなプログラミング言語は、実行前に完全にコンパイルされ、はるかに高速化されます。したがって、スクリプト以外のプログラミング言語を使用することをお勧めします。 – Dominique

答えて

1

あなたが重くdist関数を呼び出しています。低レベルの最適化を試み、より効率的なtimeit Pythonモジュールで制御することができます。私のマシンで、私はこれを試しました:

def dist(x,y): 
    d0 = y[0] -x[0] 
    d1 = y[1] -x[1] 
    d2 = y[2] -x[2] 
    return d0 * d0 + d1*d1 + d2*d2 

と時間が3倍以上速かったと言いました。

この1つはちょうど真ん中にあった:

def dist(x,y): 
    s = 0 
    for i in range(len(x)): 
     d = y[i] - x[i] 
     s += d * d 
    return s 
2

numpyを使用して、アレイ上のリストの内包表記を使用しないでください。

あなたの計算は、points-centreN x 2アレイである、N x 2配列は、この

centre = np.array((50., 50., 50.)) 
points = np.loadtxt('data') 

distances2= np.sum((points-centre)**2, axis=1) 

pointsようなベクトル表現を使用して行わ (points-centre)**2差の各要素の二乗と最終的np.sum(..., axis=1)和計算することができます軸番号に沿った二乗差の要素。 1、すなわち、列をまたいだ。位置の配列をフィルタリングするために

、あなたは

close = points[distances2<max_dist**2] 
+0

ありがとう! 0.4秒で完了します。 実際私は IND =使用し、インデックスとしない値を必要とする[範囲(LEN(近い))におけるiについて近隣のラベルのためのI + 1をラベル==点もし[I] ありそれを行うより良い方法は? – Mechanician

+0

あなたがしたいことは私にはっきりしていません...いずれの場合も、インデックスのベクトルは、式np.arange(N)[distanceances2 gboffi

関連する問題