我正在尝试使用scipy中的 interp1d()来插入一些数据,但我一直在输出out或range错误。经过几个小时的谷歌搜索,我现在知道x值不按递增顺序将导致我得到的相同错误,但我已经确定这不是问题。据我所知,看起来 interp1d()不喜欢第一个值中的小数。我错过了什么吗?
我的问题的简化版本:
以下运行正常。
import numpy as np
from scipy.interpolate import interp1d
interp1d(np.array([1, 2, 3, 4, 5, 6]),
np.array([2, 4, 6, 8, 10, 12]), kind='cubic')(np.linspace(1, 6, num=40))
但是,这个:
interp1d(np.array([1.1, 2.2, 3.3, 4.4, 5.5, 6.6]),
np.array([2, 4, 6, 8, 10, 12]), kind='cubic')(np.linspace(1, 6, num=40))
返回:
ValueError:x_new中的值低于插值范围。
但是,这很好用。
interp1d(np.array([1.0, 2.2, 3.3, 4.4, 5.5, 6.6]),
np.array([2, 4, 6, 8, 10, 12]), kind='cubic')(np.linspace(1, 6, num=40))
答案 0 :(得分:8)
inter1d
返回一个函数,允许您在数据域中插入 。当你使用
interp1d(np.array([1.1, 2.2, 3.3, 4.4, 5.5, 6.6]),
np.array([2, 4, 6, 8, 10, 12]), kind='cubic')(np.linspace(1, 6, num=40))
数据的域名是[1.1, 6.6]
的间隔,x-values
的最小值到最大值。
由于1
位于np.linspace(1, 6, num=40)
且1位于[1.1, 6.6]
之外,interp1d
会提升
ValueError: A value in x_new is below the interpolation range.
当您尝试在x-values
np.linspace(1, 6, num=40)
将数据的x-values
更改为
np.array([1.0, 2.2, 3.3, 4.4, 5.5, 6.6])
然后数据域扩展为[1.0, 6.6]
,现在包含1
。因此,np.linspace(1, 6, num=40)
处的插值现在可以正常工作。