2

ここに私の問題があります:

私は2セットの3Dポイントを持っています。それらを「Gausspoints」および「XYZ」と呼びましょう。すべてのガウス分布がガウス点の 1 つを中心とするガウス分布の和である関数を定義します。ここで、XYZ ポイントでこの関数を評価したいと思います。私のアプローチは正常に機能していますが、かなり遅いです。numpy をもう少しうまく活用してスピードアップする方法はありますか?

  def sumgaus(r):
    t=r-Gausspoints
    t=map(np.linalg.norm,t)
    t = -np.power(t,2.0)
    t=np.exp(t)
    res=np.sum(t)
    return res

result=map(sumgaus,XYZ) 

助けてくれてありがとう

編集: XYZ N*3 の形状と Gausspoints は M*3 であり、M と N は異なる整数です

Edit2: XYZ の各項目に次の関数を適用したい

ここに画像の説明を入力

4

1 に答える 1

2

注意が必要な部分は、明示的な Python のループやマッピングを行わずに、ポイント間のすべての違いの計算をベクトル化する方法です。次のようにして、ブロードキャストを使用して独自の実装を展開できます。

dist2 = XYZ[:, np.newaxis, :] - Gausspoints
dist2 *= dist
dist2 = np.sum(dist, axis=-1)

そして、XYZが形状で(n, 3)形状が である場合、点との間の距離が で、形状が になります。Gausspoints(m, 3)dist(n, m)dist[i, j]XYZ[i]Gausspoints[j]

を使用すると理解しやすい場合がありますscipy.spatial.distance.cdist

from scipy.spatial.distance import cdist

dist2 = cdist(XYZ, Gausspoints)
dist2 *= dist2

しかし、二乗距離の配列を取得したら、あとは簡単です。

f = np.sum(np.exp(-dist2), axis=1)
于 2013-08-08T12:42:13.080 に答える