gpt4 book ai didi

python - 这是 scipy.interpolate.interp1d 中的错误吗?

转载 作者:太空狗 更新时间:2023-10-30 01:21:57 25 4
gpt4 key购买 nike

当使用零阶插值时,我发现输入数组中的最后一个 Y 值没有为 X 数组中的最后一个值返回:

from scipy.interpolate import interp1d

xx = [0.0, 1.0, 2.0]
xi = interp1d(xx, xx, kind='zero')
print(xi(xx))

似乎它应该返回 [0., 1., 2.] 但它返回 [0., 1., 1.]。 xx 中的最后一个值被认为在插值范围内,但不会作为最后一个点的值返回。该文档没有提供“零”的详细信息,但我希望它会:

a) 引发 ValueError 因为输入值被认为定义了半封闭范围 [0., 1.) 和 [1., 2.) 上的值,从而使 2.0 未定义,或者

b) 返回 2.0,因为范围是 [0., 1.), [1., 2.) 和 [2., 2.)

interp1d 函数似乎认为正确答案是:

c) 返回 1.0,因为最后一个范围是一个特例,定义为闭区间 [1., 2.]

有没有正确的选择?如果是这样,它是 interp1d 实现的吗?

最佳答案

零阶样条是分段常量,在结处有不连续点,这里是插值点,所以 xi(1.0-1e-13) == 0xi( 1.0+1e-13) == 1

interp1d 中的插值区间定义为闭合的,[0, 2]。原则上,人们会期望有一个浮点值 x=2.0,它给出的结果是 2.0

但是,正如上面的评论所述,这里的样条实现来自 FITPACK,它将 k=0 样条定义为从右边的结处连续,除了最后一个间隔不同。我不知道原因 --- Fortran 代码可以追溯到 80 年代。我的猜测是它的工作方式没有特定原因,可能除了使用 B 样条表示编写这样的代码稍微更方便这一事实之外。

我认为这种行为是bug/quirk ,但由于 x 值中存在任何舍入误差都会使其影响为零,因此它的优先级一直很低。 (要考虑的一个方面是,由于没有具体说明它的作用,它是由实现定义的;破坏向后兼容可能比问题本身更糟糕。)

编辑:如其他答案所述,样条曲线实际上是由splmake 构造的;这个例程不是来自 FITPACK。如果不查看最终间隔行为是由于装配还是构造,就不能说。

关于python - 这是 scipy.interpolate.interp1d 中的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com