【问题标题】:`ValueError: A value in x_new is above the interpolation range.` - what other reasons than not ascending values?`ValueError: A value in x_new is above the interpolation range.` - 除了不升值之外还有什么其他原因?
【发布时间】:2018-01-07 20:22:26
【问题描述】:

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

有两件事可以帮助我:

  1. 一些头脑风暴 - 如果数据确实是单调的 增加,还有什么会产生这个错误?另一个提示, 关于小数,可能在this question,但我认为 我的解决方案(x 的最小值和最大值)足够强大,可以避免它。要么 不是吗?
  2. 是否有可能(如何?)返回 x_new 的值和 它是投掷ValueError: A value in x_new is above the interpolation range. 时的索引,这样我实际上可以看到 文件有问题吗?

更新

所以问题在于,出于某种原因,max(finex) 大于 max(coarsex)(一个是 .x39,另一个是 .x4)。我希望将原始值四舍五入到 2 位有效数字可以解决问题,但它没有,它显示的数字更少,但仍然计入未显示的数字。我该怎么办?

【问题讨论】:

  • coarsex 的范围相比,我会关注finex 的最小值/最大值。该消息告诉我,在需要外推的区域中,finex 的某个值大于coarsex 的任何值。
  • finex 的值怎么会大于coarsex 的值,如果说它应该只在coarsex 的最大值范围内呢?哦,我明白了,我想如果step 大于最大值和第二个最大值之间的差值,可能会发生这种情况......不,等等,它不能,因为步长是step

标签: python scipy interpolation


【解决方案1】:

如果您运行的是 Scipy v. 0.17.0 或更高版本,那么您可以pass fill_value='extrapolate' to 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()

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

【讨论】:

    【解决方案2】:

    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)
    

    这又是一个快速测试,可能会遗漏一些关键步骤或价值。

    【讨论】:

    • 宾果游戏!谢谢,你是对的,问题出在第 6 位有效数字...Min coarse, min fine, max coarse, max fine 261.4134814 261.4134814 524.9398314 524.9434814。所以我尝试将值四舍五入为 2 个有效数字,但它仍然不起作用(它是否仅在显示中四舍五入,但仍然用更多数字计数?我真的被困在浮点数中神秘位数的薄冰上吗? ?) ... 如何出行?
    猜你喜欢
    • 2020-08-25
    • 2022-11-25
    • 2022-12-01
    • 2011-03-24
    • 1970-01-01
    • 2018-10-05
    • 2016-09-20
    • 2022-09-27
    • 2019-09-05
    相关资源
    最近更新 更多