无法将数组数据从dtype('O')转换为dtype('float64')

jm2*_*22b 6 python scipy python-2.7

我正在使用scipy的curve_fit将函数拟合到一些数据,并收到以下错误;

Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'
Run Code Online (Sandbox Code Playgroud)

这将我指向代码中的这一行;

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])
Run Code Online (Sandbox Code Playgroud)

rightFunc定义如下;

def rightFunc(self, x, m, const):

    return np.exp(-(m*x + const))
Run Code Online (Sandbox Code Playgroud)

据我了解,“ O”类型是指python对象,但我看不到是什么导致了此错误。

完成错误:

详细说明收到的错误的图像

为了深入探讨此问题,我有什么想法需要调查?

hpa*_*ulj 5

通常这些scipy函数需要如下参数:

curvefit( function, initial_values, (aux_values,), ...)
Run Code Online (Sandbox Code Playgroud)

其中元组与主变量的当前值一起aux_values传递给您。function

表情是dstack这样的吗aux_values?或者是几个的串联。它可能需要包裹在tuple.

(np.dstack(transmitted[:,:,c][edgeIndex+30:])[0][0],)
Run Code Online (Sandbox Code Playgroud)

我们可能需要确切地知道这个错误出现在哪里,而不仅仅是代码的哪一行造成的。我们需要知道正在转换什么值。哪里有 dtype 对象的数组?

  • 当从大小不同的子列表列表构造数组时,通常会产生 O dtype。如果 `np.array(...)` 无法创建一个干净的数字数组,它将诉诸于创建一个对象数组。 (2认同)

MHO*_*MHO 5

只是澄清一下,我遇到了同样的问题,在自己解决之前没有在评论中看到正确的答案。所以我在这里重复一遍:

\n\n
\n

我已经解决了这个问题。我将一个包含一个元素的数组传递到 p0 列表,而不是元素本身。感谢您的帮助 \xe2\x80\x93 Jacobadtr 9 月 12 日 17:51

\n\n

当从大小不同的子列表列表构造数组时,通常会产生 O dtype。如果 np.array(...) 无法创建一个干净的数字数组,它将诉诸于创建一个对象数组。\xe2\x80\x93 hpaulj 9 月 12 日 17:15

\n
\n\n

也就是说,确保传递给 curve_fit 的参数元组可以正确转换为 numpy 数组

\n


小智 5

以防万一它可以帮助其他人,我曾经numpy.array(wavelength,dtype='float64')强制将列表中的对象转换为 numpy 的 float64。对我来说效果很好。