我一直试图使一个情节平滑如它所做的here,但我的XS是与LimStudio不兼容的DATETIME对象。
我将xs转换为matplotlib日期:
Xnew = matplotlib.dates.date2num(X)
X_smooth = np.linspace(Xnew.min(), Xnew.max(), 10)
Y_smooth = spline(Xnew, Y, X_smooth)
但后来我得到了一个空的情节
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ]
不知什么原因。
我该怎么做?
编辑
下面是我打印变量时得到的结果,我没有看到异常:
X : [datetime.date(2016, 7, 31), datetime.date(2016, 7, 30), datetime.date(2016, 7, 29)]
X new: [ 736176. 736175. 736174.]
X new max: 736176.0
X new min: 736174.0
XSMOOTH [ 736174. 736174.22222222 736174.44444444 736174.66666667
736174.88888889 736175.11111111 736175.33333333 736175.55555556
736175.77777778 736176. ]
Y [711.74, 730.0, 698.0]
YSMOOTH [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
最佳答案
你的X
值被颠倒,scipy.interpolate.spline
要求独立变量单调递增,并且该方法被弃用-使用interp1d
代替(见下文)。
>>> from scipy.interpolate import spline
>>> import numpy as np
>>> X = [736176.0, 736175.0, 736174.0] # <-- your original X is decreasing
>>> Y = [711.74, 730.0, 698.0]
>>> Xsmooth = np.linspace(736174.0, 736176.0, 10)
>>> spline(X, Y, Xsmooth)
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
先反转
X
和Y
即可>>> spline(
... list(reversed(X)), # <-- reverse order of X so also
... list(reversed(Y)), # <-- reverse order of Y to match
... Xsmooth
... )
array([ 698. , 262.18297973, 159.33767533, 293.62017489,
569.18656683, 890.19293934, 1160.79538066, 1285.149979 ,
1167.41282274, 711.74 ])
注意,许多样条插值方法要求
X
单调递增:UnivariateSpline
x
:(n,)独立输入数据的一维数组。一定在增加。InterpolatedUnivariateSpline
x
:(n,)类数组-数据点的输入维度-必须增加scipy.interpolate.spline
的默认顺序是立方的。因为只有3个数据点,所以三次样条曲线(order=3
)和二次样条曲线(order=2
)之间存在很大差异。下图显示了不同阶样条曲线之间的差异;注意:100个点用于更平滑的拟合曲线。scipy.interpolate.spline
的文档是模糊的,暗示它可能不被支持。例如,它不在scipy.interpolate
main page或interploation tutorial上列出。source for spline
显示它实际上调用spleval
和splmake
,在Additional Tools下面列出:存在向后兼容性的函数(不应该在新代码中使用)。
我会按照cricket_007的建议使用
interp1d
。这是当前建议的方法,它使用detailed examples in both the tutorial和api进行了很好的文档记录,并且它允许在默认情况下对自变量进行不排序(任何顺序)(参见api中的assume_sorted
参数)。>>> from scipy.interpolate import interp1d
>>> f = interp1d(X, Y, kind='quadratic')
>>> f(Xsmooth)
array([ 711.74 , 720.14123457, 726.06049383, 729.49777778,
730.45308642, 728.92641975, 724.91777778, 718.4271605 ,
709.4545679 , 698. ])
如果数据秩不足,也会产生错误。
>>> f = interp1d(X, Y, kind='cubic')
值错误:X和Y数组必须至少有4个条目