おはようございます。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にスケーリングすることもできます(重み付けでラップアラウンドを回避するのは非常に困難です...ヒントを感謝して受け取りました!