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

Python `ValueError:x_new中的值高于插值范围。`-除了不提升值之外,还有什么其他原因?,python,scipy,interpolation,Python,Scipy,Interpolation,我在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)

我在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个数据文件中抛出了错误。所以数据一定有问题。但据我所知,数据一直在增长。 我很抱歉没有提供一个例子,因为我无法在一个例子中重现错误

有两件事可以帮助我:

  • 一些头脑风暴-如果数据确实是单调的 增加,还有什么会产生这种错误?又一个提示,, 关于小数,可能在,但我认为 我的解决方案(x的最小值和最大值)足够健壮,可以避免它。或 不是吗
  • 是否可以(如何)返回x_new和 抛出
    ValueError时它是索引:x_new中的值高于插值范围。
    这样我就可以看到 问题出在哪里
  • 更新


    所以问题在于,出于某种原因,
    max(finex)
    大于
    max(roughex)
    (一个是.x39,另一个是.x4)。我希望将原始值四舍五入到2个有效数字可以解决问题,但事实并非如此,它显示的数字更少,但仍使用未显示的数字进行计数。对此我能做些什么?

    对您的
    finex
    calc的快速测试表明,它可以(总是?)进入外推区域

    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)
    

    同样,这是一个快速测试,可能缺少一些关键步骤或值。

    如果您运行的是Scipy v。0.17.0或更高版本,然后您可以,它将进行外推,以容纳位于插值范围之外的这些值。这样定义插值函数:

    intfunc=spi.interp1d(粗x,粗y,轴=0,fill\u value=“extraction”)

    然而,要提前得到警告! 根据数据的外观和正在执行的插值类型,外推值可能是错误的。如果您有嘈杂或非单调的数据,这一点尤其正确。在您的例子中,您可能还可以,因为您的x_新值仅略微超出了插值范围

    这里简单演示了这个特性如何很好地工作,但也会产生错误的结果

    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()
    


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

    我将重点关注
    finex
    的最小/最大值,而不是
    roughex
    的范围。该消息告诉我,在需要外推的区域中,
    finex
    的某些值大于任何
    roughex
    的值。如果声明其范围仅应为
    roughex
    的最大值,那么
    finex
    的值怎么可能大于
    roughex
    ?哦,我明白了,我想如果
    步骤
    大于最大值和第二个最大值之间的差值,可能会发生这种情况。。。不,等等,它不能,因为步骤是
    步骤
    !答对 了谢谢,你说得对,问题出在第六位有效数字的某个地方<代码>最小粗度、最小细度、最大粗度、最大细度261.4134814 261.4134814 524.9398314 524.9434814
    。所以我试着将数值四舍五入到2个有效数字,但仍然不起作用(它是否只在显示中四舍五入,但仍然使用更多的数字进行计数?我真的被困在一个浮点数中神秘的位数的薄冰上了吗?)。。。怎么走动?