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

时间:2016-09-12 14:31:40

标签: python python-2.7 scipy

我使用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

我应该调查什么想法才能找到底线?

4 个答案:

答案 0 :(得分:3)

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

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

aux_values的元组与主变量的当前值一起传递到function

dstack表达式是aux_values吗?或者是几个串联。它可能需要包含在tuple

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

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

答案 1 :(得分:3)

为了防止其他人,我使用numpy.array(wavelength,dtype='float64')强制将列表中的对象转换为numpy的float64。适合我。

答案 2 :(得分:1)

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

  

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

     

从大小不同的子列表列表构造数组时,通常会产生O类型。如果np.array(...)无法生成一个干净的n-d数组,它会转向制作一个对象数组。 - hpaulj 9月12日17:15

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

答案 3 :(得分:0)

来自here,显然是与索引类型的numpy斗争。建议的解决方案是:

  

您可以做的一件事是,只要与索引有关,或者与索引/数组大小逻辑相关,就使用np.intp作为dtype。这是它的自然dtype,它通常也是最快的。

这有帮助吗?