如果我要运行以下代码:
>>> from scipy.interpolate import interpolate
>>> import numpy as np
>>> data = np.arange(10)
>>> times = np.r_[np.arange(5),np.arange(5)]
>>> new_times = np.arange(5)
>>> f = interpolate.interp1d(times,data)
>>> interp_data = f(new_times)
我会天真(并且希望)期待以下内容:
>>> interp_data
array([2.5, 3.5, 4.5, 5.5, 6.5])
基于以下假设:共置值将在插值中进行平均和相应加权。但事实上,结果是:
>>> interp_data
array([ 0., 6., 7., 8., 9.])
导致此行为的原因是什么,以及如何纠正?
答案 0 :(得分:1)
来自interp1d
文档:
assume_sorted:bool,optional如果为False,则x的值可以是任意值 订单,他们先排序。如果为True,则x必须是一个数组 单调增加值。
我只能通过明确强制assume_sorted
得到True
得到的结果:
>>> f = interpolate.interp1d(times,data, assume_sorted=True)
>>> interp_data = f(new_times)
>>> interp_data
array([ 0., 6., 7., 8., 9.])
从您的代码中可以看出assume_sorted
默认为True
,这是您不希望得到的答案。
如果您明确地将其设置为False
,根据文档,interp1d
会自动对其进行排序,然后进行插值,给出
>>> f = interpolate.interp1d(times,data)
>>> interp_data = f(new_times)
>>> interp_data
array([ nan, 1., 2., 3., 4.])
与文档一致。
答案 1 :(得分:0)
我不确定你想要什么,但似乎interp可能不是实现这一目标的最佳方法。插值函数f应将单个输入与单个输出相关联,即
from scipy.interpolate import interpolate
import numpy as np
data = np.arange(2.,8.)
times = np.arange(data.shape[0])
new_times = np.arange(0.5,5.,1.)
f = interpolate.interp1d(times,data)
interp_data = f(new_times)
或者,也许答案如下: Get sums of pairs of elements in a numpy array 可能是你想要的?
答案 2 :(得分:0)
不,interp1d
不会为您的数据加权,平均或做任何其他事情。
它希望对数据进行排序。如果您的scipy足够近(0.14或更高),它有assume_sorted
关键字,您可以将其设置为False,然后它就会为您排序。未排序数据的精确行为未定义。