カイ二乗関数を評価しようとしています。つまり、任意の (ブラックボックス) 関数をデータの numpy ベクトル配列と比較します。現時点では、Python で配列をループしていますが、このようなものは非常に遅いです。
n=len(array)
sigma=1.0
chisq=0.0
for i in range(n):
data = array[i]
model = f(i,a,b,c)
chisq += 0.5*((data-model)/sigma)**2.0
return chisq
array は 1 次元の numpy 配列で、a、b、c はスカラーです。numpy.sum() またはある種のラムダ関数などを使用してこれを高速化する方法はありますか? 次のように 1 つのループ (chisq 経由) を削除する方法を確認できます。
numpy.sum(((array-model_vec)/sigma)**2.0)
ただし、配列 model_vec を明示的に設定する必要がありますが、これはおそらく同じくらい遅くなります。次のような明示的なループなしでそれを行うにはどうすればよいですか:
model_vec=numpy.zeros(len(data))
for i in range(n):
model_vec[i] = f(i,a,b,c)
return numpy.sum(((array-model_vec)/sigma)**2.0)
?
ありがとう!