为什么scipy不会对共置值进行内插平均值?

时间:2015-03-17 11:19:35

标签: 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 = 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.])

导致此行为的原因是什么,以及如何纠正?

3 个答案:

答案 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,然后它就会为您排序。未排序数据的精确行为未定义。