我正在尝试使用scipy.interp2d使用Python 2.7基于我拥有的数据集构建插值函数。但是,每当我运行Python时,它都会不断抛出该警告:
/usr/lib/python2.7/dist-packages/scipy/interpolate/_fitpack_impl.py:975: RuntimeWarning: No more knots can be added because the additional knot would
coincide with an old one. Probable cause: s too small or too large
a weight to an inaccurate data point. (fp>s)
kx,ky=1,1 nx,ny=18,4 m=106 fp=1355.885984 s=0.000000
warnings.warn(RuntimeWarning(_iermess2[ierm][0] + _mess))
如果我使用三次或三次而不是线性,则会出现类似的警告。
数据本身看起来像这样:
x y z
400 0.1 24.5525361598
500 0.1 30.3102509102
700 0.1 36.9604444013
800 0.1 38.8662807180
900 0.1 40.2185588452
1000 0.1 41.2610946000
...
1300 1 50.7991409954
1400 1 50.7991411538
1500 1 50.7991416176
1600 1 50.7991433783
....
1100 10 51.3296099771
1200 10 51.3296099928
1300 10 51.3296100395
1400 10 51.3296101921
1500 10 51.3296108783
1600 10 51.3296145611
...
2500 100 52.2442339828
2600 100 52.3526243978
2700 100 52.4918053348
2800 100 52.6511782816
我在其他地方读过,这可能是scipy.interp2d中的错误-如果是这样,有什么解决方法吗?如果是我的数据有问题,该如何解决?
谢谢!
答案 0 :(得分:1)
错误消息指出s
太小或重量太大。您尝试过更大的s
吗?该文档说:
s : float, optional
A non-negative smoothing factor. If weights correspond
to the inverse of the standard-deviation of the errors in z,
then a good s-value should be found in the range
``(m-sqrt(2*m),m+sqrt(2*m))`` where m=len(x).
在scipy文档的底部,它说
内插器由bisplrep构建,具有平滑因子 为0。如果需要进一步控制平滑,则应该使用bisplrep 直接使用。
然后使用bisplev
进行插值:bisplev(xs, ys, tck, ...)
,其中xs,ys是插值的坐标,tck是bisplrep
的输出。