私はすでに次のコードを書いています。これはまさに私が望んでいることを実行しますが、遅すぎます。高速化する方法があることは確かですが、どうすればよいかわかりません。コードの最初の部分は、何がどの形状であるかを示すだけです。
測定値の 2 つの画像 (VV1
およびHH1
)シミュレートさ
れた
値とシミュレーVV
トされた値の両方が 3つのパラメーター (値に対してHH
事前に計算されたもの) に依存する事前計算された値(101, 31, 11)
VV
HH
VV1 = numpy.ndarray((54, 43)).flatten()
HH1 = numpy.ndarray((54, 43)).flatten()
precomp = numpy.ndarray((101, 31, 11, 2))
変化させる 3 つのパラメータのうちの 2 つ
comp = numpy.zeros((len(parameter1), len(parameter2)))
for i,(vv,hh) in enumerate(zip(VV1,HH1)):
comp0 = numpy.zeros((len(parameter1),len(parameter2)))
for j in range(len(parameter1)):
for jj in range(len(parameter2)):
comp0[j,jj] = numpy.min((vv-precomp[j,jj,:,0])**2+(hh-precomp[j,jj,:,1])**2)
comp+=comp0
私がしなければならないことは明らかですが、できる限り多くの for ループを取り除くことですが、numpy.min
より多くの次元で作業するときに適切に動作させる方法がわかりません。
2 番目のこと (ベクトル化できる場合はそれほど重要ではありませんが、それでも興味深い) は、RAM ではなく CPU 時間がほとんどかかることに気付きましたが、すでに長い間検索しましたが、「parfor」のようなものを記述する方法が見つかりません。 " matlab の "for" の代わりに ( @parallel
for ループを別のメソッドに入れるだけで、デコレータを作成することは可能ですか?)
編集:Janne Karilaへの返信:ええ、それは間違いなくそれを大幅に改善します、
for (vv,hh) in zip(VV1,HH1):
comp+= numpy.min((vv-precomp[...,0])**2+(hh-precomp[...,1])**2, axis=2)
間違いなくはるかに高速ですが、外側の for ループも削除する可能性はありますか? または何かを使用して、forループを並列にする方法はあり@parallel
ますか?