我的编程空间,编程开发者的网络收藏夹
学习永远不晚

scipy.interpolate插值方法实例讲解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

scipy.interpolate插值方法实例讲解

scipy.interpolate插值方法

1 一维插值

from scipy.interpolate import interp1d
1维插值算法

from scipy.interpolate import interp1d
x = np.linspace(0, 10, num=11, endpoint=True)
y = np.cos(-x**2/9.0)
f = interp1d(x, y)
f2 = interp1d(x, y, kind='cubic')
xnew = np.linspace(0, 10, num=41, endpoint=True)
import matplotlib.pyplot as plt
plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')
plt.legend(['data', 'linear', 'cubic'], loc='best')
plt.show()

数据点,线性插值结果,cubic插值结果:

在这里插入图片描述

2 multivariate data

from scipy.interpolate import interp2d

from scipy.interpolate import griddata
多为插值方法,可以应用在2Dlut,3Dlut的生成上面,比如当我们已经有了两组RGB映射数据, 可以插值得到一个查找表。

二维插值的例子如下:

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt

from scipy.interpolate import griddata, RegularGridInterpolator, Rbf

if __name__ == "__main__":
    x_edges, y_edges = np.mgrid[-1:1:21j, -1:1:21j]
    x = x_edges[:-1, :-1] + np.diff(x_edges[:2, 0])[0] / 2.
    y = y_edges[:-1, :-1] + np.diff(y_edges[0, :2])[0] / 2.

    # x_edges, y_edges 是 20个格的边缘的坐标, 尺寸 21 * 21
    # x, y 是 20个格的中心的坐标, 尺寸 20 * 20

    z = (x + y) * np.exp(-6.0 * (x * x + y * y))

    print(x_edges.shape, x.shape, z.shape)
    plt.figure()
    lims = dict(cmap='RdBu_r', vmin=-0.25, vmax=0.25)
    plt.pcolormesh(x_edges, y_edges, z, shading='flat', **lims) # plt.pcolormesh(), plt.colorbar() 画图
    plt.colorbar()
    plt.title("Sparsely sampled function.")
    plt.show()

    # 使用grid data
    xnew_edges, ynew_edges = np.mgrid[-1:1:71j, -1:1:71j]
    xnew = xnew_edges[:-1, :-1] + np.diff(xnew_edges[:2, 0])[0] / 2. # xnew其实是 height new
    ynew = ynew_edges[:-1, :-1] + np.diff(ynew_edges[0, :2])[0] / 2.
    grid_x, grid_y = xnew, ynew

    print(x.shape, y.shape, z.shape)
    points = np.hstack((x.reshape(-1, 1), y.reshape(-1, 1)))
    z1 = z.reshape(-1, 1)

    grid_z0 = griddata(points, z1, (grid_x, grid_y), method='nearest').squeeze()
    grid_z1 = griddata(points, z1, (grid_x, grid_y), method='linear').squeeze()
    grid_z2 = griddata(points, z1, (grid_x, grid_y), method='cubic').squeeze()

    rbf = Rbf(points[:, 0], points[:, 1], z, epsilon=2)
    grid_z3 = rbf(grid_x, grid_y)

    plt.subplot(231)
    plt.imshow(z.T, extent=(-1, 1, -1, 1), origin='lower')
    plt.plot(points[:, 0], points[:, 1], 'k.', ms=1)
    plt.title('Original')
    plt.subplot(232)
    plt.imshow(grid_z0.T, extent=(-1, 1, -1, 1), origin='lower')
    plt.title('Nearest')
    plt.subplot(233)
    plt.imshow(grid_z1.T, extent=(-1, 1, -1, 1), origin='lower', cmap='RdBu_r')
    plt.title('Linear')
    plt.subplot(234)
    plt.imshow(grid_z2.T, extent=(-1, 1, -1, 1), origin='lower')
    plt.title('Cubic')
    plt.subplot(235)
    plt.imshow(grid_z3.T, extent=(-1, 1, -1, 1), origin='lower')
    plt.title('rbf')
    plt.gcf().set_size_inches(8, 6)
    plt.show()


在这里插入图片描述

示例2:

def func(x, y):
    return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2


grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j]


rng = np.random.default_rng()
points = rng.random((1000, 2))
values = func(points[:,0], points[:,1])

from scipy.interpolate import griddata
grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')
grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')
grid_z2 = griddata(points, values, (grid_x, grid_y), method='cubic')

import matplotlib.pyplot as plt
plt.subplot(221)
plt.imshow(func(grid_x, grid_y).T, extent=(0,1,0,1), origin='lower')
plt.plot(points[:,0], points[:,1], 'k.', ms=1)
plt.title('Original')
plt.subplot(222)
plt.imshow(grid_z0.T, extent=(0,1,0,1), origin='lower')
plt.title('Nearest')
plt.subplot(223)
plt.imshow(grid_z1.T, extent=(0,1,0,1), origin='lower')
plt.title('Linear')
plt.subplot(224)
plt.imshow(grid_z2.T, extent=(0,1,0,1), origin='lower')
plt.title('Cubic')
plt.gcf().set_size_inches(6, 6)
plt.show()

在这里插入图片描述

3 Multivariate data interpolation on a regular grid

from scipy.interpolate import RegularGridInterpolator

已知一些grid上的值。
可以应用在2Dlut,3Dlut,当我们已经有了一个多维查找表,然后整个图像作为输入,得到查找和插值后的输出。

二维网格插值方法(好像和resize的功能比较一致)

# 使用RegularGridInterpolator
import matplotlib.pyplot as plt
from scipy.interpolate import RegularGridInterpolator

def F(u, v):
    return u * np.cos(u * v) + v * np.sin(u * v)

fit_points = [np.linspace(0, 3, 8), np.linspace(0, 3, 8)]
values = F(*np.meshgrid(*fit_points, indexing='ij'))

ut, vt = np.meshgrid(np.linspace(0, 3, 80), np.linspace(0, 3, 80), indexing='ij')
true_values = F(ut, vt)
test_points = np.array([ut.ravel(), vt.ravel()]).T

interp = RegularGridInterpolator(fit_points, values)
fig, axes = plt.subplots(2, 3, figsize=(10, 6))
axes = axes.ravel()
fig_index = 0
for method in ['linear', 'nearest', 'linear', 'cubic', 'quintic']:
    im = interp(test_points, method=method).reshape(80, 80)
    axes[fig_index].imshow(im)
    axes[fig_index].set_title(method)
    axes[fig_index].axis("off")
    fig_index += 1
axes[fig_index].imshow(true_values)
axes[fig_index].set_title("True values")
fig.tight_layout()
fig.show()
plt.show()

在这里插入图片描述

4 Rbf 插值方法

interpolate scattered 2-D data

import numpy as np
from scipy.interpolate import Rbf
import matplotlib.pyplot as plt
from matplotlib import cm

# 2-d tests - setup scattered data
rng = np.random.default_rng()
x = rng.random(100) * 4.0 - 2.0
y = rng.random(100) * 4.0 - 2.0
z = x * np.exp(-x ** 2 - y ** 2)


edges = np.linspace(-2.0, 2.0, 101)
centers = edges[:-1] + np.diff(edges[:2])[0] / 2.

XI, YI = np.meshgrid(centers, centers)
# use RBF
rbf = Rbf(x, y, z, epsilon=2)
Z1 = rbf(XI, YI)

points = np.hstack((x.reshape(-1, 1), y.reshape(-1, 1)))
Z2 = griddata(points, z, (XI, YI), method='cubic').squeeze()

# plot the result
plt.figure(figsize=(20,8))
plt.subplot(1, 2, 1)
X_edges, Y_edges = np.meshgrid(edges, edges)
lims = dict(cmap='RdBu_r', vmin=-0.4, vmax=0.4)
plt.pcolormesh(X_edges, Y_edges, Z1, shading='flat', **lims)
plt.scatter(x, y, 100, z, edgecolor='w', lw=0.1, **lims)
plt.title('RBF interpolation - multiquadrics')
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.colorbar()

plt.subplot(1, 2, 2)
X_edges, Y_edges = np.meshgrid(edges, edges)
lims = dict(cmap='RdBu_r', vmin=-0.4, vmax=0.4)
plt.pcolormesh(X_edges, Y_edges, Z2, shading='flat', **lims)
plt.scatter(x, y, 100, z, edgecolor='w', lw=0.1, **lims)
plt.title('griddata - cubic')
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.colorbar()
plt.show()

得到结果如下, RBF一定程度上和 griddata可以互用, griddata方法比较通用

在这里插入图片描述

[1]https://docs.scipy.org/doc/scipy/tutorial/interpolate.html

到此这篇关于scipy.interpolate插值方法介绍的文章就介绍到这了,更多相关scipy.interpolate插值内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

scipy.interpolate插值方法实例讲解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

scipy.interpolate插值方法实例讲解

这篇文章主要介绍了scipy.interpolate插值方法介绍,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-12-29

C# Decimal.Round()方法实例讲解

Decimal.Round()方法是C#中用于对decimal类型的数值进行四舍五入的方法。它的语法如下:public static decimal Round(decimal d)public static decimal Round(d
2023-09-28

Python中实现插值法的示例详解

这篇文章详细阐述了Python中插值法,一种用于估计未知函数值的技术。它介绍了线性插值,并提供了使用NumPy的Python代码示例。文章还讨论了其他插值方法、插值法的应用以及其限制。通过理解插值法及其适用范围,读者可以利用它在数据分析、图像处理和科学计算等领域获得准确的预测。
Python中实现插值法的示例详解
2024-04-02

实例讲解vue的截取方法

Vue是一种流行的JavaScript框架,它可以帮助您构建快速响应的单页面应用程序。Vue框架提供了许多实用的功能,其中一个非常实用的功能是截取(slice)方法。本文将介绍Vue的截取方法,包括语法,如何使用以及一些实际的示例。## 什么是截取方法?在Vue中,截取方法是指从一个数组或字符串的特定位置开始,截取出一定长度的子数组或子字符串。截取方法可以帮助您轻松地操作和管理
2023-05-14

实例讲解gist的使用方法

在程序员的日常工作中,经常需要使用代码托管服务来管理自己的项目。而Github作为最大、最流行、最广泛使用的软件代码托管服务商,相信是大家非常熟悉的。而在 Github 中,精选的 Git 代码片段存储库,就是 gist, 它可以被看做是一
2023-10-22

pythonwordcloud库实例讲解使用方法

这篇文章主要介绍了pythonwordcloud库实例,词云通过以词语为基本单位,更加直观和艺术地展示文本。wordcloud是优秀的词云展示的python第三方库
2022-12-30

实例讲解Android中SQLiteDatabase使用方法

SQLite数据库是android系统内嵌的数据库,小巧强大,能够满足大多数SQL语句的处理工作,而SQLite数据库仅仅是个文件而已。虽然SQLite的有点很多,但并不是如同PC端的mysql般强大,而且android系统中不允许通过JD
2022-06-06

Python实现拉格朗日插值法的示例详解

插值法是一种数学方法,用于在已知数据点(离散数据)之间插入数据,以生成连续的函数曲线,而格朗日插值法是一种多项式插值法。本文就来用Python实现拉格朗日插值法,希望对大家有所帮助
2023-02-08

Vue3 全局实例上挂载属性方法案例讲解

这篇文章主要介绍了Vue3 全局实例上挂载属性方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-18

MyBatis实现批量插入方法实例

最近在公司项目开发中遇到批量数据插入或者更新,下面这篇文章主要给大家介绍了关于MyBatis实现批量插入的相关资料,需要的朋友可以参考下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录