Python Scipy插值仅允许线性插值,否则会引发错误
我正在尝试使用Python Scipy插值仅允许线性插值,否则会引发错误,python,scipy,interpolation,Python,Scipy,Interpolation,我正在尝试使用scipy.interpolate.interp1d 使用线性插值似乎效果不错,但如果我尝试使用二次或三次插值,则会产生以下错误: ValueError:x应该是一维排序数组。\u类似于。 以下是我的代码的简化版本: from __future__ import division import numpy as np import matplotlib.pyplot as plt from scipy import interpolate x = data2[:,0] y = d
scipy.interpolate.interp1d
使用线性插值似乎效果不错,但如果我尝试使用二次或三次插值,则会产生以下错误:
ValueError:x应该是一维排序数组。\u类似于。
以下是我的代码的简化版本:
from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
x = data2[:,0]
y = data2[:,1]
xnew = data3[:,0]
f = interpolate.interp1d(x, y, kind='linear') #This works for kind='linear', but not 'quadratic' or 'cubic'
ynew = f(xnew)
x和y看起来像这样:
print x
>>> [55113. 55120. 55123. 55126. 55171. 55213. 55231. 55234. 55436. 55446.
55474. 55475. 55480. 55497. 55505. 55508. 55514. 55556. 55568. 55570.
55574. 55600. 55603. 55605. 55611. 55614. 55800. 55823. 55834. 55840.
...
58528. 58541. 58547. 58554. 58701. 58721. 58737. 58748. 58759. 58768.]
#=================
print y
>>> [0.01908541 0.01971167 0.0194646 0.01874254 0.01864027 0.01960122
0.01862151 0.01850946 0.02040462 0.01998174 0.02093472 0.02075255
0.02041515 0.02126069 0.02201405 0.02160587 0.02218664 0.0213718
...
0.01937561 0.01975203 0.01989411 0.01958265 0.0200566 0.01976214]
然后xnew是一个以整数间隔在min(x)和max(x)之间的linspace,即
print xnew
>>> [55113. 55114. 55115. ... 58765. 58766. 58767.]
最后,关于输入数据的一些附加信息:
print type(x)
print type(y)
print type(xnew)
print x.shape
print y.shape
print xnew.shape
>>> <type 'numpy.ndarray'>
>>> <type 'numpy.ndarray'>
>>> <type 'numpy.ndarray'>
>>> (970,)
>>> (970,)
>>> (3655,)
打印类型(x)
打印类型(y)
打印类型(新)
打印x.shape
打印y形
打印xnew.shape
>>>
>>>
>>>
>>> (970,)
>>> (970,)
>>> (3655,)
基本上我不理解这个错误-x是一个排序的一维数组,所以我看不出问题所在
以下是用于可视化目的的原始光照曲线和线性插值光照曲线:
提前感谢您的帮助 你介意试着在interp1d中用
np.linspace(np.amin(x),np.amax(x),x.size)
代替x吗?嘿,谢谢你的建议。但是这样做是没有意义的,因为这完全改变了光照曲线的形状-存在需要保持在那里的间隙,并且执行np.linspace
覆盖了所有的自然间隙。它确实允许我用你的方法做三次插值,但我需要能够在没有完全连续的x轴的情况下完成。下面是一个它看起来像什么的图表-蓝色是原始的,橙色是新的[如果执行print(np.amin(x[1:]-x[:-1]),会得到什么结果]
?我认为三次插值必须严格大于0才能起作用。有趣的是,这给了我精确的0。这意味着什么?可以做些什么来克服它?这意味着在x上至少有两个相同的连续点。这就是三次插值失败的原因。