3

おはようございます。Numpy で距離加重平均を行うための Cressman フィルターを実装しています。ボール ツリーの実装 (Jake VanderPlas に感謝) を使用して、要求配列内の各ポイントの位置のリストを返します。クエリ配列 (q ) は形状 [n,3] であり、各ポイントにはポイントの x、y、z があります。ツリーに格納されているポイントの加重平均を実行したい.. ツリーにラップされたコードは、特定の距離内のポイントを返すので、可変長配列の配列を取得します。空でないエントリ (つまり、影響範囲内に少なくともいくつかの点があった位置) を検索する場所を使用して、isgood 配列を作成します...

次に、すべてのクエリ ポイントをループして、値 self.z の加重平均を返します (複数の共同グリッドを許可するために、これは dims=1 または dims=2 のいずれかであることに注意してください)。

したがって、マップまたは他のより迅速な方法を使用することを複雑にするのは、self.distances および self.locations 内の配列の長さの不均一性です...私はまだ numpy/python にかなり慣れていますが、その方法を考えることができませんこの配列ごと(つまり、ループに戻らない)

self.locations, self.distances = self.tree.query_radius( q, r, return_distance=True)
t2=time()
if debug: print "Removing voids"
isgood=np.where( np.array([len(x) for x in self.locations])!=0)[0]
interpol = np.zeros( (len(self.locations),) + np.shape(self.z[0]) )
interpol.fill(np.nan)
for dist, ix, posn, roi in zip(self.distances[isgood], self.locations[isgood], isgood, r[isgood]):
    interpol[isgood[jinterpol]] = np.average(self.z[ix], weights=(roi**2-dist**2) / (roi**2 + dist**2), axis=0)
    jinterpol += 1

そう...ループを高速化する方法のヒントはありますか?..

距離、方位角、標高グリッドからデカルト グリッドへの気象レーダー データのマッピングに適用される典型的なマッピングでは、240x240x34 ポイントと 4 つの変数があり、ツリーを照会するのに 99 秒かかります (C と cython で Jake によって記述されています。これはデータを検索する必要があるため、難しいステップです!) 計算を行うのに 100 秒かかります...私の意見では、どちらが遅いですか?? 私のオーバーヘッドはどこですか?np.mean は効率的ですか、それとも何百万回も呼び出されるため、ここで得られるスピードアップはありますか? default64ではなくfloat32を使用することで得られるでしょうか...またはintにスケーリングすることもできます(重み付けでラップアラウンドを回避するのは非常に困難です...ヒントを感謝して受け取りました!

4

1 に答える 1

0

クレスマンスキームとガウス重み関数の使用の相対的なメリットについては、次の場所で説明しています。

http://www.flame.org/~cdoswell/publications/radar_oa_00.pdf

重要なのは、平滑化パラメーターをデータに一致させることです(データポイント間の平均間隔に近い値を使用することをお勧めします)。平滑化パラメーターがわかれば、重み関数が0.01(またはその他)に低下する半径に等しい「影響半径」を設定できます。

スピードはどれほど重要ですか?必要に応じて、指数関数を呼び出して重みを決定するのではなく、一定数の半径増分の重みの離散テーブルを作成できます。これにより、計算が大幅に高速化されます。理想的には、グリッドポイントを囲む値のマッピングで使用できるグリッド境界の外側のデータが必要です(グリッドの境界ポイントでも)。これは真の内挿スキームではないことに注意してください。データポイントで観測された値を正確に返すことはありません。クレスマンスキームのように、それはローパスファイラーです。

于 2011-06-03T15:37:15.887 に答える