我在scipy interp1d函数中收到此错误。通常,如果x不是单调增加,则会产生此错误。
import scipy.interpolate as spi
def refine(coarsex,coarsey,step):
finex = np.arange(min(coarsex),max(coarsex)+step,step)
intfunc = spi.interp1d(coarsex, coarsey,axis=0)
finey = intfunc(finex)
return finex, finey
for num, tfile in enumerate(files):
tfile = tfile.dropna(how='any')
x = np.array(tfile['col1'])
y = np.array(tfile['col2'])
finex, finey = refine(x,y,0.01)
代码是正确的,因为它成功处理了6个数据文件并将错误扔到了第7个。所以数据一定有问题。但据我所知,数据一直在增加。 我很抱歉没有提供示例,因为我无法在示例中重现错误。
有两件事可以帮助我:
ValueError: A value in x_new is above the interpolation range.
时它是索引,这样我才能真正看到它在哪里
文件是问题吗?更新
所以问题在于,由于某些原因,max(finex)
大于max(coarsex)
(一个是.x39而另一个是.x4)。我希望将原始值四舍五入到2位有效数字可以解决问题,但事实并非如此,它显示的数字较少,但仍然计算未显示的数字。我该怎么办呢?
答案 0 :(得分:12)
如果你正在运行Scipy v.1.17.0或更新版本,那么你可以pass fill_value='extrapolate'
to spi.interp1d
,它将推断出这些超出插值范围的值。所以定义插值函数如下:
intfunc = spi.interp1d(coarsex, coarsey,axis=0, fill_value="extrapolate")
根据您的数据外观和您正在执行的插值类型,外推值可能是错误的。如果您有嘈杂或非单调数据,则尤其如此。在你的情况下,你可能没问题,因为你的x_new值只是 slighly 超出你的插值范围。
这里简单演示了这个功能如何很好地工作,但也给出了错误的结果。
import scipy.interpolate as spi
import numpy as np
x = np.linspace(0,1,100)
y = x + np.random.randint(-1,1,100)/100
x_new = np.linspace(0,1.1,100)
intfunc = spi.interp1d(x,y,fill_value="extrapolate")
y_interp = intfunc(x_new)
import matplotlib.pyplot as plt
plt.plot(x_new,y_interp,'r', label='interp/extrap')
plt.plot(x,y, 'b--', label='data')
plt.legend()
plt.show()
因此插值部分(红色)运行良好,但由于噪声,外推部分显然无法遵循此数据中的其他线性趋势。因此,请对您的数据有所了解并谨慎行事。
答案 1 :(得分:1)
对finex
计算的快速测试表明它可以(始终?)进入外推区域。
In [124]: coarsex=np.random.rand(100)
In [125]: max(coarsex)
Out[125]: 0.97393109991816473
In [126]: step=.01;finex=np.arange(min(coarsex), max(coarsex)+step, step);(max(
...: finex),max(coarsex))
Out[126]: (0.98273730602114795, 0.97393109991816473)
In [127]: step=.001;finex=np.arange(min(coarsex), max(coarsex)+step, step);(max
...: (finex),max(coarsex))
Out[127]: (0.97473730602114794, 0.97393109991816473)
同样,这是一个快速测试,可能会遗漏一些关键步骤或价值。