scipy 如何在点之间插值

vyu0f0g1  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(121)

我有一个数据集,显示如下

temp = [0.1, 1, 4, 10, 15, 20, 25, 30, 35, 40]
sg =[0.999850, 0.999902, 0.999975, 0.999703, 0.999103, 0.998207, 0.997047, 0.995649, 0.99403, 0.99222]

sg_temp = pd.DataFrame({'temp' : temp,
                        'sg' : sg})
 temp        sg
0   0.1  0.999850
1   1.0  0.999902
2   4.0  0.999975
3  10.0  0.999703
4  15.0  0.999103
5  20.0  0.998207
6  25.0  0.997047
7  30.0  0.995649
8  35.0  0.994030
9  40.0  0.992220

我想用样条插值法在0.001的范围内对0.1到40之间的所有值进行插值,并使这些点也出现在 Dataframe 中。我以前用过resample(),但似乎找不到这种情况下的等效方法。
我已经尝试过这个基于其他问题,但它不工作。

scale = np.linspace(0, 40, 40*1000)
interpolation_sg = interpolate.CubicSpline(list(sg_temp.temp), list(sg_temp.sg))
aydmsdu9

aydmsdu91#

它对我来说非常好用。到底什么对你来说不好用呢?你是否正确地使用了返回的CubicSpline来生成插值?还是有某种错误?
基本上,通过将新的x值(scale)插入到返回的CubicSpline函数中,可以获得插值y值:

y = interpolation_sg(scale)

我认为这就是问题所在,你可能期望插值函数返回值,但是它返回的是一个函数,你用这个函数来得到你的值。
如果我把这个画出来,我会得到这个图:

import matplotlib.pyplot as plt
plt.plot(sg_temp['temp'], sg_temp['sg'], marker='o', ls='') # Plots the originial data
plt.plot(scale, interpolation_sg(scale)) # Plots the interpolated data

l5tcr1uw

l5tcr1uw2#

用插值的结果调用scale

from scipy import interpolate

out  = pd.DataFrame(
 {'temp': scale,
  'sg': interpolate.CubicSpline(sg_temp['temp'],
                                sg_temp['sg'])(scale)
 })

视觉输出:

地块代码

ax = plt.subplot()
out.plot(x='temp', y='sg', label='interpolated', ax=ax)
sg_temp.plot(x='temp', y='sg', marker='o', label='sg', ls='', ax=ax)

相关问题