技术背景

插值法在图像处理和信号处理、科学计算等领域中是非常常用的一项技术。不同的插值函数,可以根据给定的数据点构造出来一系列的分段函数。这一点有别于函数拟合,函数拟合一般是指用一个给定形式的连续函数,来使得给定的离散数据点距离函数曲线的总垂直距离最短,不一定会经过所有的函数点。比如在二维坐标系内,用一条直线去拟合一个平面三角形所对应的三个顶点,那么至少有一个顶点是不会落在拟合出来的直线上的。而根据插值法所得到的结果,一定是经过所有给定的离散点的。本文针对scipy和numpy这两个python库的插值算法接口,来看下两者的不同实现方案。

插值算法

常用的插值算法比如线性插值,原理非常简单。给定两个点\((X_{t_0},Y_{t_0})\)和\((X_{t_1},Y_{t_1})\),其中\(t_0<=t_1\),假如需要计算点\((X_{t_2},Y_{t_2})\)的值,其中\(t_0<=t_2<=t_1\),那么给定的插值公式就是:

\[\begin{align}
X_{t_2}&=(X_{t_1}-X_{t_0})*\frac{t_2-t_0}{t_1-t_0}+X_{t_0}\\
Y_{t_2}&=(Y_{t_1}-Y_{t_0})*\frac{t_2-t_0}{t_1-t_0}+Y_{t_0}
\end{align}
\]

而还有一种比较常用的算法是三次样条插值(cubic spline),其原理是在所有给定的\(n\)个离散点之间构建\(n-1\)个三次函数:

\[y_i=a_i+b_ix_i+c_ix_i^2+d_ix_i^3
\]

三次样条插值的约束条件是给定的函数在端点处连续、给定函数的一次导数在端点处连续、给定函数的二次导数在端点处连续,再根据边界条件的不同取法,可以构造出不同的三次样条插值函数。如下图所示就是三种不同的边界条件取法(图片来自于参考链接3):

接下来看下scipy中的线性插值和三次样条插值的接口调用方式,以及numpy中实现的线性插值的调用方式(numpy中未实现三次样条插值算法):

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt x = np.linspace(0, 4, 12)
y = np.cos(x**2/3+4) int1 = interpolate.interp1d(x,y,kind='linear')
int2 = interpolate.interp1d(x,y,kind='cubic')
new_x = np.linspace(0, 4, 30) plt.figure()
plt.plot(x,y,'o',color='black')
plt.plot(new_x,int1(new_x),'-',color='blue')
plt.plot(new_x,int2(new_x),'--',color='orange')
plt.plot(new_x,np.interp(new_x,x,y),'x',color='red')
plt.legend(['data','linear','cubic','numpy'],loc='best')
plt.savefig('_interpolate.png')

得到的结果如下图所示:

在这个结果中我们发现,numpy的线性插值和scipy的线性插值所得到的结果是一样的,而scipy的三次样条插值的曲线显然要比线性插值更加平滑一些,这也跟三次样条插值算法本身的约束条件有关系。

总结概要

线性插值和三次样条插值都是非常常用的插值算法,使用插值法,可以帮助我们对离散的样本信息进行扩展,得到样本信息中所不包含的样本点的信息。插值法有着非常广泛的应用场景,就比如某手机厂商所号称的x千万像素拍照,其中插值法就发挥了重要作用。在python的scipy这个库中实现了线性插值算法和三次样条插值算法,而numpy库中实现了线性插值的算法,我们通过这两者的不同使用方式,来看下所得到的插值的结果。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/interpolate.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958

参考链接

  1. https://www.yiibai.com/scipy/scipy_interpolate.html
  2. https://blog.csdn.net/NockinOnHeavensDoor/article/details/83385732
  3. https://zhuanlan.zhihu.com/p/62860859

Scipy和Numpy的插值对比的更多相关文章

  1. SciPy和Numpy处理能力

    1.SciPy和Numpy的处理能力: numpy的处理能力包括: a powerful N-dimensional array object N维数组: advanced array slicing ...

  2. Windows下安装Scipy和Numpy失败的解决方案

    使用 pip 安装 Scipy 库时,经常会遇到安装失败的问题 pip install numpy pip install scipy 后来网上搜寻了一番才得以解决.scipy 库需要依赖 numpy ...

  3. 转Python SciPy库——拟合与插值

    1.最小二乘拟合 实例1 import numpy as np import matplotlib.pyplot as plt from scipy.optimize import leastsq p ...

  4. Windows下python virtualenv使用,镜像源设置,批量安装,安装scipy,numpy

    镜像源设置 在C:\Users\Administrator\下建立pip文件夹,然后在里面创建了一个pip.ini 内容为: [global]index-url = https://pypi.tuna ...

  5. python(5):scipy之numpy介绍

    python 的scipy 下面的三大库: numpy, matplotlib, pandas scipy 下面还有linalg 等 scipy 中的数据结构主要有三种: ndarray(n维数组), ...

  6. Numpy 与 DataFrame对比与应用

    (一)对比Numpty 与 DataFrame默认索引取值不同点 Numpy索引取值 #Numpy索引取值 data=np.empty((2,4),dtype=int) print(data) ''' ...

  7. [Python] Scipy and Numpy(1)

    import numpy as np #Create an array of 1*10^7 elements arr = np.arange(1e7) #Converting ndarray to l ...

  8. windows下安装python科学计算环境,numpy scipy scikit ,matplotlib等

    安装matplotlib: pip install matplotlib 背景: 目的:要用Python下的DBSCAN聚类算法. scikit-learn 是一个基于SciPy和Numpy的开源机器 ...

  9. Python下科学计算包numpy和SciPy的安装

    转载自:http://blog.sina.com.cn/s/blog_62dfdc740101aoo6.html Python下大多数工具包的安装都很简单,只需要执行 “python setup.py ...

随机推荐

  1. 【以太坊剖析】以太坊虚拟机(EVM)之基本定义

    以太坊虚拟机(EVM) 以太坊虚拟机(Ethereum Virtual Machine,简称EVM)是一个基于栈的虚拟机,基于特定的环境数据,执行一系列的字节代码形式的指令,以修改系统状态.EVM目前 ...

  2. Java 高效编程(Effective Java)中文第三版(补档)

    来源:sjsdfg/effective-java-3rd-chinese <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过, ...

  3. BOM与DOM之DOM操作

    目录 一:DOM操作 1.DOM介绍 2.DOM标准规定HTML文档中的每个成分都是一个节点(node): 3.DOM操作需要用关键字 二:查找标签 1.id查找 类查找 标签查找(直接查找) 2.i ...

  4. 部分文件的MIMEType

    类型 文件拓展名 MIMEType 图片 png image/png bmp\dib image/bmp jpe\jpeg\jpg image/jpeg gif image/gif 多媒体 mp3 a ...

  5. Android Studio中添加对HttpClient的支持包

    感谢大佬:https://blog.csdn.net/gladiator0975/article/details/49177959 sdk6.0以后取消了HttpClient,设置android SD ...

  6. 关于SVN常用命令之export

    SVN官方命令参考地址:http://www.subversion.org.cn/svnbook/nightly/svn.ref.html 关于export命令 导出一个干净的不带.svn文件夹的目录 ...

  7. oracle锁表问题处理

    文章转载自:http://blog.itpub.net/31397003/viewspace-2142672/ "ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或 ...

  8. iis7下的php实现urlrewrite,并隐藏index.php

    1 <rewrite> 2 <rules> 3 <rule name="OrgPage" stopProcessing="true" ...

  9. 动态修改UINavigationBar的背景色--by-胡旭

    这是我们最终想要得到的效果 思路 在UISrollView的delegate方法 - (void)scrollViewDidScroll:(UIScrollView *)scrollView中根据当前 ...

  10. 直播流媒体ums

    准备工具 下载  UltrantMediaServer服务器 FlashMediaLiveEncoder测试直播工具 第一步 安装 UltrantMediaServer服务器 第二步 打开网也输入   ...