Scipy和Numpy的插值对比
技术背景
插值法在图像处理和信号处理、科学计算等领域中是非常常用的一项技术。不同的插值函数,可以根据给定的数据点构造出来一系列的分段函数。这一点有别于函数拟合,函数拟合一般是指用一个给定形式的连续函数,来使得给定的离散数据点距离函数曲线的总垂直距离最短,不一定会经过所有的函数点。比如在二维坐标系内,用一条直线去拟合一个平面三角形所对应的三个顶点,那么至少有一个顶点是不会落在拟合出来的直线上的。而根据插值法所得到的结果,一定是经过所有给定的离散点的。本文针对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\),那么给定的插值公式就是:
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\)个三次函数:
\]
三次样条插值的约束条件是给定的函数在端点处连续、给定函数的一次导数在端点处连续、给定函数的二次导数在端点处连续,再根据边界条件的不同取法,可以构造出不同的三次样条插值函数。如下图所示就是三种不同的边界条件取法(图片来自于参考链接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
参考链接
- https://www.yiibai.com/scipy/scipy_interpolate.html
- https://blog.csdn.net/NockinOnHeavensDoor/article/details/83385732
- https://zhuanlan.zhihu.com/p/62860859
Scipy和Numpy的插值对比的更多相关文章
- SciPy和Numpy处理能力
1.SciPy和Numpy的处理能力: numpy的处理能力包括: a powerful N-dimensional array object N维数组: advanced array slicing ...
- Windows下安装Scipy和Numpy失败的解决方案
使用 pip 安装 Scipy 库时,经常会遇到安装失败的问题 pip install numpy pip install scipy 后来网上搜寻了一番才得以解决.scipy 库需要依赖 numpy ...
- 转Python SciPy库——拟合与插值
1.最小二乘拟合 实例1 import numpy as np import matplotlib.pyplot as plt from scipy.optimize import leastsq p ...
- Windows下python virtualenv使用,镜像源设置,批量安装,安装scipy,numpy
镜像源设置 在C:\Users\Administrator\下建立pip文件夹,然后在里面创建了一个pip.ini 内容为: [global]index-url = https://pypi.tuna ...
- python(5):scipy之numpy介绍
python 的scipy 下面的三大库: numpy, matplotlib, pandas scipy 下面还有linalg 等 scipy 中的数据结构主要有三种: ndarray(n维数组), ...
- Numpy 与 DataFrame对比与应用
(一)对比Numpty 与 DataFrame默认索引取值不同点 Numpy索引取值 #Numpy索引取值 data=np.empty((2,4),dtype=int) print(data) ''' ...
- [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 ...
- windows下安装python科学计算环境,numpy scipy scikit ,matplotlib等
安装matplotlib: pip install matplotlib 背景: 目的:要用Python下的DBSCAN聚类算法. scikit-learn 是一个基于SciPy和Numpy的开源机器 ...
- Python下科学计算包numpy和SciPy的安装
转载自:http://blog.sina.com.cn/s/blog_62dfdc740101aoo6.html Python下大多数工具包的安装都很简单,只需要执行 “python setup.py ...
随机推荐
- shell脚本的分发,测试,查看
#!/bin/bash for i in {2..64} do #远端复制文件或目录 rcp /test/cpuburn-in 10.1.1.$i:/test/ done #!/bin/bash fo ...
- java中的数据模型类
package com.aaa.zxf.ajax.test; import java.io.Serializable; /** * java中的继承. * * 一.数据模型类 * 数据模型类:用来存取 ...
- EKS助力小白实践云原生——通过k8s部署wordpress应用
目前云原生在大厂已经有了充分的实践,也逐渐向小厂以及非互联网公司推广.适逢12月20日,腾讯云原生[燎原社]精心打造了云原生在线技术工坊,让零基础的同学也能快速入门和实践 Docker 和 Kuber ...
- iOS9新特性之常见关键字
/* nullable:1.怎么使用(语法) 2.什么时候使用(作用) nullable作用:可能为空 nullable 语法1 @property (nonatomic, strong, nulla ...
- 对JSP中的Session 简单理解
我的理解: 简单来说,要使用服务器端的session对象,就是要有其对应的key,即sessionid,它只认识sessionid. 下面我说的cookie,url重写或者隐藏表单,都是为了将其对应的 ...
- Android Studio 插件(不定期更新)
GsonFormat 根据JSONObject格式的字符串,自动生成实体类参数. 安装 1.Android studio File->Settings-->Plugins -->in ...
- ARP数据包分析
转载请注明来源:https://www.cnblogs.com/hookjc/ 本机IP:192.168.0.1 (c0 a8 00 01)本机MAC:00-50-56-c0-00-01目标IP:19 ...
- 使用python实现冒泡排序和快速排序
1 def bubble(arr): 2 """冒泡排序""" 3 loop = len(arr) - 1 4 if loop > 0 ...
- @Resource注解和@Autowired注解
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11770982.html 1. @Resource 类来源: javax(Java扩展包) 类全 ...
- docker基础——1.原理解读
1. 相关内核知识 docker本质上是宿主机上的进程. 通过namespace实现资源隔离,通过cgroups实现资源限制,通过写时复制机制copy-on-write实现高效文件操作. 依赖kern ...