web-dev-qa-db-ja.com

配列データをdtype( 'O')からdtype( 'float64')にキャストできません

私は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オブジェクトを指しますが、このエラーの原因がわかりません。

完全なエラー:

Image detailing the error received

これの底に到達するために私が調査すべきことについてのアイデアはありますか?

9
jm22b

通常、これらのscipy関数には次のようなパラメーターが必要です。

curvefit( function, initial_values, (aux_values,), ...)

ここで、aux_valuesのタプルは、メイン変数の現在の値とともにfunctionに渡されます。

dstack式はaux_valuesですか?または、いくつかの連結。 Tupleでラップする必要がある場合があります。

(np.dstack(transmitted[:,:,c][edgeIndex+30:])[0][0],)

コードのどの行でエラーが発生したかだけでなく、このエラーが発生した場所を正確に知る必要がある場合があります。どの値が変換されているかを知る必要があります。 dtypeオブジェクトの配列はどこにありますか?

3
hpaulj

他の誰かを助けることができるように、リストのオブジェクトをnumpyのfloat64に強制的に変換するためにnumpy.array(wavelength,dtype='float64')を使用しました。私にはうまくいきます。

4
Adrine Correya

明確にするために、私は同じ問題を抱えていて、自分で解決する前にコメントに正しい答えがありませんでした。だから私はここでそれらを繰り返すだけです:

私は問題を解決しました。要素自体ではなく、1つの要素を持つ配列をp0リストに渡していました。ご協力ありがとうございます– Jacobadtr 9月12日17:51

サイズが異なるサブリストのリストから配列を作成すると、O dtypeが発生することがよくあります。 np.array(...)が数値のクリーンなn-d配列を作成できない場合は、オブジェクトの配列を作成することを使用します。 – hpaulj 9月12日17:15

つまり、curve_fitに渡すパラメーターのタプルをnumpy配列に適切にキャストできることを確認してください。

2
MHO

here から、どうやら乱暴なインデックスタイプとの闘い。提案されるソリューションは次のとおりです。

あなたができることの一つは、物事が索引付けに関わる必要があるとき、または索引付け/配列サイズに論理的に関連しているときはいつでも、ntype.intpをdtypeとして使用することです。これは自然なdtypeであり、通常は最速のタイプでもあります。

これは役に立ちますか?

0
NickBraunagel