6

次のように定義された関数を時系列データに適合させたいと思います。

def func(t, a0, a1, a2, T, tau1, tau2):
    if t < T:
        return a0 + a1 * np.exp(-t/tau1) + a2 * np.exp(-t/tau2)
    else:
        return a0 + a1 * np.exp(-T/tau1) * (1 - t/tau1 + T/tau1) + a2 * np.exp(-T/tau2) * (1 - t/tau2 + T/tau2) 

ここで、tは測定が行われる時間を表し、残りの引数は関数のパラメーターです。問題は、それをcurve_fitにフィードすると、Pythonがt<T比較のあいまいさについて文句を言うことです。これは、funcがcurve_fit内で呼び出されたときに、tがデータポイントのリストになるのに対し、Tは数値(リストではない)であるために発生すると思います。

popt, pcov = curve_fit(func, t1, d1)

ここで、t1は時間のリストであり、d1は対応する時間に測定されたデータ値のリストです。私はこの問題を回避するためにいくつかの方法を試みましたが、役に立ちませんでした。なにか提案を?どうもありがとう!

4

1 に答える 1

8

そうt < Tです、ブール配列です。NumPyは、可能な選択肢が多数あるため、ブール配列に真理値を割り当てることを拒否します。すべての要素がTrueの場合、またはいずれかの要素がTrueの場合、Trueにする必要がありますか?

しかし、それは大丈夫です。この場合、NumPyはif ... else ...ブロックを置き換えるための優れた関数、つまりnp.whereを提供します。

def func(t, a0, a1, a2, T, tau1, tau2):
    return np.where(
        t < T,
        a0 + a1 * np.exp(-t/tau1) + a2 * np.exp(-t/tau2),
        a0 + a1 * np.exp(-T/tau1) * (1 - t/tau1 + T/tau1) + a2 * np.exp(-T/tau2) * (1 - t/tau2 + T/tau2) )
于 2012-11-09T19:50:58.523 に答える