私はscipyのcurve_fitを使用して関数をいくつかのデータに適合させ、次のエラーを受け取ります。
Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'
これは私のコードのこの行を示しています。
popt_r, pcov = curve_fit(
self.rightFunc, np.array(wavelength)[beg:end][edgeIndex+30:],
np.dstack(transmitted[:,:,c][edgeIndex+30:])[0][0],
p0=[self.m_right, self.a_right])
rightFuncは次のように定義されます。
def rightFunc(self, x, m, const):
return np.exp(-(m*x + const))
私が理解しているように、「O」タイプはpythonオブジェクトを指しますが、このエラーの原因がわかりません。
完全なエラー:
これの底に到達するために私が調査すべきことについてのアイデアはありますか?
通常、これらのscipy
関数には次のようなパラメーターが必要です。
curvefit( function, initial_values, (aux_values,), ...)
ここで、aux_values
のタプルは、メイン変数の現在の値とともにfunction
に渡されます。
dstack
式はaux_values
ですか?または、いくつかの連結。 Tuple
でラップする必要がある場合があります。
(np.dstack(transmitted[:,:,c][edgeIndex+30:])[0][0],)
コードのどの行でエラーが発生したかだけでなく、このエラーが発生した場所を正確に知る必要がある場合があります。どの値が変換されているかを知る必要があります。 dtypeオブジェクトの配列はどこにありますか?
他の誰かを助けることができるように、リストのオブジェクトをnumpyのfloat64に強制的に変換するためにnumpy.array(wavelength,dtype='float64')
を使用しました。私にはうまくいきます。
明確にするために、私は同じ問題を抱えていて、自分で解決する前にコメントに正しい答えがありませんでした。だから私はここでそれらを繰り返すだけです:
私は問題を解決しました。要素自体ではなく、1つの要素を持つ配列をp0リストに渡していました。ご協力ありがとうございます– Jacobadtr 9月12日17:51
サイズが異なるサブリストのリストから配列を作成すると、O dtypeが発生することがよくあります。 np.array(...)が数値のクリーンなn-d配列を作成できない場合は、オブジェクトの配列を作成することを使用します。 – hpaulj 9月12日17:15
つまり、curve_fitに渡すパラメーターのタプルをnumpy配列に適切にキャストできることを確認してください。
here から、どうやら乱暴なインデックスタイプとの闘い。提案されるソリューションは次のとおりです。
あなたができることの一つは、物事が索引付けに関わる必要があるとき、または索引付け/配列サイズに論理的に関連しているときはいつでも、ntype.intpをdtypeとして使用することです。これは自然なdtypeであり、通常は最速のタイプでもあります。
これは役に立ちますか?