現在、Python で大きな for ループを使用して記述したコードをベクトル化しようとしています。ベクトル化されたコードは次のとおりです。
rho[pi,pj] += (rho_coeff*dt)*i_frac*j_frac
rho[pi+1,pj] += (rho_coeff*dt)*ip1_frac*j_frac
rho[pi,pj+1] += (rho_coeff*dt)*i_frac*jp1_frac
rho[pi+1,pj+1] += (rho_coeff*dt)*ip1_frac*jp1_frac
、 、、 、 、のそれぞれは、pi
1次元ですべて同じ長さの numpy 配列です。は、2 次元の numpy 配列です。行列のどの要素が変更されたかを示す座標 ( 、 ) のリストを作成します。この変更には、( , ) 要素への用語の追加と、隣接する要素への同様の用語の追加 (( +1, )、( , +1) および ( +1, +1) が含まれます。リスト ( 、) 内の各座標には、固有の 、、、およびが関連付けられています。pj
dt
i_frac
j_frac
ip1_frac
jp1_frac
rho
pi
pj
pi
pj
rho
(rho_coeff*dt)*i_frac*j_frac
pi
pj
pi
pj
pi
pj
pi
pj
pi
pj
dt
i_frac
j_frac
ip1_frac
jp1_frac
問題は、リストが繰り返し座標を持つことができる (そして常に持つ) ことです。したがってrho
、リスト内で同じ座標が検出されるたびに連続して追加する代わりに、最後の繰り返し座標に対応する用語のみを追加します。この問題は、Tentative Numpy Tutorialの仮の Numpy チュートリアルで、インデックスの配列を使用した凝ったインデックス付けの例で簡単に説明されています (ブール値のインデックス付けの前の最後の 3 つの例を参照してください)。残念ながら、彼らはこれに対する解決策を提供しませんでした。
for
ループに頼らずにこの操作を行う方法はありますか? パフォーマンスを最適化しようとしており、可能であればループをなくしたいと考えています。
参考までに: このコードは、各粒子からの電荷が、体積分率に基づいて粒子の位置を囲むメッシュの 4 つの隣接するノードに追加される 2D 粒子追跡アルゴリズムの一部を形成します。