SciPy 插值

2019/11/07 11:41
阅读数 0

<div class="article-child "><h2>章节</h2><ul><li class="page_item page-item-3474"><a href="https://www.qikegu.com/docs/3474">SciPy 介绍</a></li> <li class="page_item page-item-3477"><a href="https://www.qikegu.com/docs/3477">SciPy 安装</a></li> <li class="page_item page-item-3479"><a href="https://www.qikegu.com/docs/3479">SciPy 基础功能</a></li> <li class="page_item page-item-3590"><a href="https://www.qikegu.com/docs/3590">SciPy 特殊函数</a></li> <li class="page_item page-item-3484"><a href="https://www.qikegu.com/docs/3484">SciPy k均值聚类</a></li> <li class="page_item page-item-3488"><a href="https://www.qikegu.com/docs/3488">SciPy 常量</a></li> <li class="page_item page-item-3492"><a href="https://www.qikegu.com/docs/3492">SciPy fftpack(傅里叶变换)</a></li> <li class="page_item page-item-3499"><a href="https://www.qikegu.com/docs/3499">SciPy 积分</a></li> <li class="page_item page-item-3554"><a href="https://www.qikegu.com/docs/3554">SciPy 插值</a></li> <li class="page_item page-item-3558"><a href="https://www.qikegu.com/docs/3558">SciPy 输入输出</a></li> <li class="page_item page-item-3563"><a href="https://www.qikegu.com/docs/3563">SciPy 线性代数</a></li> <li class="page_item page-item-3573"><a href="https://www.qikegu.com/docs/3573">SciPy 图像处理</a></li> <li class="page_item page-item-3584"><a href="https://www.qikegu.com/docs/3584">SciPy 优化</a></li> <li class="page_item page-item-3588"><a href="https://www.qikegu.com/docs/3588">SciPy 信号处理</a></li> <li class="page_item page-item-3593"><a href="https://www.qikegu.com/docs/3593">SciPy 统计</a></li> </ul></div>


插值,是依据一系列的点(xi,yi)通过一定的算法找到一个合适的函数来包含(逼近)这些点,反应出这些点的走势规律,然后根据走势规律求其他点值的过程。

scipy.interpolate包里有很多类可以实现对一些已知的点进行插值,即找到一个合适的函数,例如,interp1d类,当得到插值函数后便可用这个插值函数计算其他xj对应的的yj值了,这也就是插值的意义所在。

一维插值interp1d

interp1d类可以根据输入的点,创建拟合函数。

准备数据

让我们首先创建一些点,作为输入:

示例

通过采样几个点获取数据:

import numpy as np
from scipy import interpolate as intp
import matplotlib.pyplot as plt
x = np.linspace(0, 4, 12)
y = np.cos(x**2/3 + 4)
print (x)
print (y)

输出

[0.         0.36363636 0.72727273 1.09090909 1.45454545 1.81818182
 2.18181818 2.54545455 2.90909091 3.27272727 3.63636364 4.        ]
[ 0.28366219  0.29287074  0.35652484  0.52035398  0.78524277  0.99671469
  0.70096272 -0.43008856 -0.87804302  0.84953035 -0.4614798   0.4979562 ]

让我们画出这些点:

plt.plot(x, y,’o’)
plt.show()

scipy插值1

interp1d 插值

根据上面示例中的数据,使用interp1d类创建拟合函数:

f1 = intp.interp1d(x, y, kind = 'linear')

f2 = intp.interp1d(x, y, kind = 'cubic')

上面创建了两个函数f1和f2。通过这些函数,输入x可以计算y。kind表示插值使用的技术类型,例如:'Linear', 'Nearest', 'Zero', 'Slinear', 'Quadratic', 'Cubic'等等。

现在,增加输入数据,与前面示例比较一下:

xnew = np.linspace(0, 4, 30)

plt.plot(x, y, 'o', xnew, f1(xnew), '-', xnew, f2(xnew), '--')

plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best')

plt.show()

上面的程序将生成以下输出:

scipy插值2

噪声数据插值

可以通过interpolate模块中UnivariateSpline类对含有噪声的数据进行插值运算。

使用UnivariateSpline类,输入一组数据点,通过绘制一条平滑曲线来去除噪声。绘制曲线时可以设置平滑参数s,如果参数s=0,将对所有点(包括噪声)进行插值运算,也就是说s=0时不去除噪声。

示例

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
x = np.linspace(-3, 3, 50)
y = np.exp(-x**2) + 0.1 * np.random.randn(50) # 通过random方法添加噪声数据
plt.plot(x, y, 'ro', ms=5)

# 平滑参数使用默认值
spl = UnivariateSpline(x, y)
xs = np.linspace(-3, 3, 1000)
plt.plot(xs, spl(xs), 'b', lw=3) # 蓝色曲线

# 设置平滑参数
spl.set_smoothing_factor(0.5)
plt.plot(xs, spl(xs), 'g', lw=3) # 绿色曲线

# 设置平滑参数为0
spl.set_smoothing_factor(0)
plt.plot(xs, spl(xs), 'yellow', lw=3) # 黄色曲线

plt.show() 

输出

scipy插值3

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部