2011-12-06 14 views
5

いくつかのnumpy配列に格納された座標と測定データを処理する最適な方法(最速のパフォーマンス)を探しています。Numpy/Pythonでのパフォーマンスの高速処理

各測定位置(添付画像の灰色、ターゲット、灰色、灰色、ターゲットからの範囲)までの各格子点(添付画像の緑色でのロット、lon、alt値)からの距離を計算する必要があります。そこに格子点の何百もあり、測定の数千人が、各格子点のために計算する範囲として見て、私は間で決定しようとしています

enter image description here

可能な限り最も効率的な方法で配列を反復処理したいと思いますどのようにグリッドと測定のLLA測定値を保存するか、測定距離値と実際の範囲との間のデルタに基づいてグリッド上の各点の平均二乗誤差を計算することが理想的です。

これらの値を最適に保存し、各測定値から範囲を決定するためにグリッドを反復処理する方法についてのアイデアは非常に高く評価されます。ありがとう!!!

現在、Iは

# Create a 2D Grid that will be used to store the MSE estimations 
# First, create two 1-D arrays representing the X and Y coordinates of our grid 
x_delta = abs(xmax-xmin)/gridsize_x 
y_delta = abs(ymax-ymin)/gridsize_y 
X = np.arange(xmin,xmax+x_delta,x_delta) 
Y = np.arange(ymin,ymax+y_delta,y_delta) 

# Next, pass arrays to meshgrid to return 2-D coordinate matrices from the 1-D coordinate arrays 
grid_lon, grid_lat = np.meshgrid(X, Y) 

私は測定クラス

measurement_lon = [measurement.gps.getlon() for measurement in target_measurements] 
measurement_lat = [measurement.gps.getlat() for measurement in target_measurements] 
measurement_range = [measurement.getrange() for measurement in target_measurements] 

に記憶された測定値からLLA点と範囲値を有するグリッドのLLA値を格納するために2D関数meshgridを使用してい測定クラス

class RangeMeasurement: 

def __init__(self, lat, lon, alt, range): 
    self.gps = GpsLocation(lat,lon,alt) 
    self.range = range 

範囲計算のための本当に悪い擬似コード(iterativ http://docs.scipy.org/doc/scipy/reference/spatial.distance.html

あなたが2列とNとの2-D numpyの配列としてあなたのポイントを保存する必要があります:私はscipy.spatial.distanceモジュールは、この問題にあなたを助けるだろうと思い、eと非常に遅い)

for i in len(grid_lon): 
    for j in len(measurement_lat): 
    range_error += distance(grid_lon[i],grid_lat[i],measurement_lon[j],measurement_lat[j])-measurement_range[j]  
+0

(//は、整数の除算である。)

grid_x = flat_grid_idx % gridsize_x grid_y = flat_grid_idx // gridsize_x 

を使用残念ながら、私はまだ画像を投稿することはできませんあなたが興味を持っている場合、私はあなたにサンプル画像をメールで送ることができます – Alex

+2

あなたは画像共有サイトにそれを投稿して、十分な評判を持つ私たちの1人がリンクを適切に投稿することができます。 – mac

+0

オファーをいただきありがとうございます! – Alex

答えて

3

ここで、Nは配列内の点の数です。この形式にgrid_lonとgrid_latを変換するために、これは、格子と同じ形状の矩形アレイ状に配置されているgrid_lonの値の全てを取り、でアレイにそれらを置く

N1 = grid_lon.size 
grid_point_array = np.hstack([grid_lon.reshape((N1,1)), grid_lat.reshape((N1,1))]) 

使用1列とN行。これはgrid_latでも同じです。次に、2つの1列幅の配列を結合して、2列の配列を作成します。

同様の方法は、あなたの測定データを変換するために使用することができます。

N2 = len(measurement_lon) 
measurment_data_array = np.hstack([np.array(measurement_lon).reshape((N2,1)), 
    np.array(measurement_lat).reshape((N2,1))]) 

あなたのデータは、この形式になると、あなたは簡単にscipy.spatial.distanceとポイントの各ペア間の距離を見つけることができます。

d = scipy.spatial.distance.cdist(grid_point_array, measurement_data_array, 'euclidean') 

dはN1行とN2列の配列になり、d [i、j]は格子点iと測定点jの距離になります。

編集範囲エラーを明確にしていただきありがとうございます。興味深いプロジェクトのように聞こえる。これは、最小の累積二乗誤差であなたに格子点を与える必要があります:

measurement_range_array = np.array(measurement_range) 
flat_grid_idx = pow(measurement_range_array-d,2).sum(1).argmin() 

これは、ポイントの測定範囲とすべての格子点からの距離の違いを取得するためにbroadcastingを利用しています。与えられたグリッドポイントのすべてのエラーが合計され、結果の1次元配列が探している累積エラーでなければなりません。最小値の位置を見つけるためにargmin()が呼び出されます。私は新しいUSER-メッセージに私をAMAとして平坦化インデックスから座標xとyのグリッドを取得するには、

+0

ありがとう - これは私にとって素晴らしい仕事でした。私はLLAグリッドポイントをECEF(Earth Centered Earth Fixed)ポジションに変換して3Dで解決しました。また、XYZ座標上のscipy.spatial.cistance.cdistを実行すると、出力はメートル単位になります。 – Alex

+0

「実測値」と「計算値」の範囲を説明するために、各測定値(上記の緑色)はLLAと送信機の推定範囲を示します。計算グリッドの目的は、送信デバイスを見つけることです。グリッド上の各ポイントを繰り返して、各特定のポイントまでのすべての測定値の累積誤差を求めます。誤差の最も小さい点が目標位置に最も近いはずである。 – Alex

関連する問題