interpolate.splrep错误:'knots必须为task=-1给出

0 投票
2 回答
644 浏览
提问于 2025-04-18 18:11

我正在尝试用以下代码找到数据的最小二乘立方样条曲线拟合:

from scipy import interpolate
plt.subplot(223)
l_hits = np.array(l_hits)
list1 = np.log(l_hits)
knots = list1.sort()
xnew = np.arange(min(l_bins), max(l_bins))
tck = interpolate.splrep(l_bins,list1,s=0,k=3,task=-1,t=knots)
fnew = interpolate.splev(xnew, tck, der=0)
plt.plot(xnew, fnew, 'b-')

这里的x值是l_bins,y值是np.log(l_hits) = list1。但是我总是遇到这个错误:

TypeError: Knots must be given for task =-1

我为什么会出现这个错误,应该怎么解决呢?

2 个回答

0

根据这个API文档

如果提供了节点t,它必须满足Schoenberg-Whitney条件,也就是说,必须有一部分数据点x[j],使得t[j]小于x[j],而x[j]又小于t[j+k+1],这里的j从0到n-k-2。

在你的情况下,

l_bins = ?
knots = list(np.log(l_hits)).sort()

从问题中不清楚knots是否满足Schoenberg-Whitney条件。

0

numpy的sort方法是直接在原来的数据上进行排序的,并且它不会返回任何值,所以这一行代码:

knots = list1.sort()

会把knots设置为None,也就是没有值。

如果你想实现你原本的意图,可以试试这样做:

knots = list1.copy()
knots.sort()

撰写回答