python - scipy UnivariateSpline 因多值 X 而失败
问题描述
scipy UnivariateSpline 不允许多值 X。我读到这已经改变,但似乎对我不起作用。我用的是最新版本,刚刚用pip尝试下载,说我有最新的。
我尝试将 s (平滑)从 0 和 None (定义为 X 必须严格增加),但这并不能解决问题。
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
x=[152,152,152,152,152,159,159,159,159,159,166,166,166,166,166,174,174,174,174,174,181,181,181,181,181,188,188,188,188,188,194,194,194,194,194,202,202,202,202,202,208,208,208,208,208,215,215,215,215,215,222,222,222,222,222,229,229,229,229,229,236,236,236,236,236,243,243,243,243,243,250,250,250,250,250,258,258,258,258]
y=[-1.31639523,-1.90045889,-1.81769285,-1.25702203,-1.31975784,-0.76206863,-0.74170737,-0.66029284,-0.58124809,-0.49593701,-0.19309943,0.02254396,-0.04614866,0.06709774,0.10436002,0.577175,0.56809403,0.89547559,0.60922195,0.76220672,1.0461253,1.1304339,1.56360338,1.34189828,1.41658105,1.98677786,2.40487089,2.20431052,1.91072699,2.49328809,2.670556,2.85024397,3.24333426,2.44841554,3.14604703,3.39128172,3.78063788,3.21446612,3.07158159,3.79503965,3.40717945,4.02417242,3.70708767,4.00729682,4.25504517,4.28874564,3.9356614,4.30337567,4.02388633,4.65376986,4.33884509,4.68839858,4.10508666,4.26236997,4.53098529,5.03443645,4.07940011,4.3033351,4.43476139,4.80221614,4.49558967,4.5052504,4.40289487,5.15433152,5.1330299,4.30299696,4.47974301,5.34886789,4.60896298,5.35997675,4.40204983,5.50162549,4.3056854,4.87120463,5.36265274,4.33578634,5.06347439,4.46811258,5.30920785]
s = 0.1 # set smoothing to non-zero
spl = UnivariateSpline(x, y, s=s)
我收到此错误消息:-
spl = UnivariateSpline(x, y, s=s)
File "C:\Python37\lib\site-packages\scipy\interpolate\fitpack2.py", line 177, in __init__
raise ValueError('x must be strictly increasing')
ValueError: x must be strictly increasing.
任何帮助或建议都将受到欢迎!
解决方案
明白了!在查看代码几个小时后,我找到了一个链接https://github.com/kawache/Python-B-spline-examples给了我一个线索,我现在可以产生类似于我原来的 FORTRAN 代码的结果(这是使用 MG Cox 原始代码1编写,随后修改为 Cox & de Boor 2)。
也许我应该把它写成“样条拟合连续不规则时间点的多个观测数据”。
感谢您提供的所有帮助。
这是我的代码:-
import matplotlib.pyplot as plt
from scipy import interpolate
import numpy as np
x=[152.0,152,152,152,152,159,159,159,159,159,166,166,166,166,166,174,174,174,174,174,181,181,181,181,181,188,188,188,188,188,194,194,194,194,194,202,202,202,202,202,208,208,208,208,208,215,215,215,215,215,222,222,222,222,222,229,229,229,229,229,236,236,236,236,236,243,243,243,243,243,250,250,250,250,250,258,258,258,258]
y=[-1.31639523,-1.90045889,-1.81769285,-1.25702203,-1.31975784,-0.76206863,-0.74170737,-0.66029284,-0.58124809,-0.49593701,-0.19309943,0.02254396,-0.04614866,0.06709774,0.10436002,0.577175,0.56809403,0.89547559,0.60922195,0.76220672,1.0461253,1.1304339,1.56360338,1.34189828,1.41658105,1.98677786,2.40487089,2.20431052,1.91072699,2.49328809,2.670556,2.85024397,3.24333426,2.44841554,3.14604703,3.39128172,3.78063788,3.21446612,3.07158159,3.79503965,3.40717945,4.02417242,3.70708767,4.00729682,4.25504517,4.28874564,3.9356614,4.30337567,4.02388633,4.65376986,4.33884509,4.68839858,4.10508666,4.26236997,4.53098529,5.03443645,4.07940011,4.3033351,4.43476139,4.80221614,4.49558967,4.5052504,4.40289487,5.15433152,5.1330299,4.30299696,4.47974301,5.34886789,4.60896298,5.35997675,4.40204983,5.50162549,4.3056854,4.87120463,5.36265274,4.33578634,5.06347439,4.46811258,5.30920785]
plt.plot(x, y, 'ro', ms=5)
tck,u = interpolate.splprep([x,y],k=3,s=32)
u=np.linspace(0,1,num=50,endpoint=True)
out = interpolate.splev(u,tck)
plt.plot(x, y, 'ro', out[0], out[1], 'b' )
plt.show()
和结果(随后是 Cox 1和 de Boor 2的原始样条曲线图)。
1:MG Cox,“b 样条的数值评估”,J. Inst。数学应用,10,p.134-149,1972。
2 : C. de Boor,“关于使用 b 样条进行计算”,J. 近似理论,6,p.50-62,1972。
推荐阅读
- ios - 构建应用程序后未显示 Xcode13 应用程序图标
- r - scales = "free" 对 facet_grid 没有影响
- javascript - 如何使用 NodeJS 在 Mongodb 中使用 updateOne
- c++ - 从返回不完整输出的未排序链表中删除重复项
- tensorflow - 验证集和测试集的结果不同
- python - 如何在 Python 中的每个循环周期后获取下一个 n[0:1] 字母?
- actionscript-3 - 我如何使用以下课程?我应该在我的 .fla 文件中写什么?
- javascript - 当我使用部分网站崩溃
- php - 每当一个新用户注册时,他一直在我的 php 项目中看到另一个用户输入的数据
- javascript - d3.js 正在渲染黑色矩形而不是地图