我使用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对象,但我无法看到导致此错误的原因。
完成错误:
我应该调查什么想法才能找到底线?
答案 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,它通常也是最快的。
这有帮助吗?