Python 为什么';t scipy';s在同一个值上插值平均值?

Python 为什么';t scipy';s在同一个值上插值平均值?,python,arrays,scipy,interpolation,Python,Arrays,Scipy,Interpolation,如果要运行以下代码: >>> 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 = interpola

如果要运行以下代码:

>>> 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.])

导致这种行为的原因是什么?如何纠正?

来自
interp1d
文档:

假设_sorted:bool,如果为False,则可选,x的值可以是任意形式 按顺序排列,然后首先进行排序。如果为True,则x必须是 单调递增的值

我只能通过明确强制
假设排序为
真来获得您得到的结果:

>>> f = interpolate.interp1d(times,data, assume_sorted=True)
>>> interp_data = f(new_times)
>>> interp_data
array([ 0.,  6.,  7.,  8.,  9.])
从您的代码中可以看出,
假定\u sorted
默认为
True
,这给出了您不期望的答案

如果显式将其设置为
False
,根据文档,
interp1d
会自动对其排序,然后执行插值,给出

>>> f = interpolate.interp1d(times,data)
>>> interp_data = f(new_times)
>>> interp_data
array([ nan,   1.,   2.,   3.,   4.])

这与文档一致。

我不确定您到底想要什么,但似乎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)
或者,也可以这样回答:
可能是您想要的吗?

不,
interp1d
不会对数据进行加权、平均或其他处理

它希望对数据进行排序。如果您的scipy足够新(0.14或更高),它有
假定\u排序的
关键字,您可以将其设置为False,然后它将为您排序。未排序数据的精确行为尚未定义