`ValueError:x_new中的值高于插值范围. - 除了不提升值之外还有什么其他原因?

dur*_*hit 8 python interpolation scipy

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

代码是正确的,因为它成功地处理了6个数据文件并将错误扔到了第7个.所以数据一定有问题.但据我所知,数据一直在增加.我很抱歉没有提供示例,因为我无法在示例中重现错误.

有两件事可以帮助我:

  1. 一些头脑风暴 - 如果数据确实单调增加,还有什么可能产生这个错误?关于小数的另一个提示可能就是这个问题,但我认为我的解决方案(x的最小值和最大值)足够强大以避免它.或者不是吗?
  2. 是否有可能(怎么样?)在抛出时返回x_new的值和它的索引,ValueError: A value in x_new is above the interpolation range.这样我才能真正看到文件中的哪个位置出现问题?

UPDATE

所以问题在于,由于某种原因,max(finex)大于max(coarsex)(一个是.x39而另一个是.x4).我希望将原始值四舍五入到2位有效数字可以解决问题,但事实并非如此,它显示的数字较少,但仍然计算未显示的数字.我能做些什么呢?

sai*_*000 22

如果您正在运行Scipy v.1.17.0或更新版本,那么您可以传递fill_value='extrapolate'spi.interp1d它,并且它将推断出这些位于插值范围之外的值.所以定义你的插值函数如下:

intfunc = spi.interp1d(coarsex, coarsey,axis=0, fill_value="extrapolate")

但是要预先警告!

根据您的数据外观和您正在执行的插值类型,外推值可能是错误的.如果您有嘈杂或非单调数据,则尤其如此.在您的情况下,您可能没问题,因为您的x_new值仅略微超出了插值范围.

这里简单演示了这个功能如何很好地工作,但也给出了错误的结果.

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

在此输入图像描述

因此,插值部分(红色)运行良好,但由于噪声,外推部分显然无法遵循该数据中的其他线性趋势.因此,请对您的数据有所了解,并谨慎行事.