pythonscipy教程_Python学习教程(Python学习路线):Python—SciPy精讲

2023-11-01

SciPy 是 Python 里处理科学计算 (scientific computing) 的包,使用它遇到问题可访问它的官网 (https://www.scipy.org/). 去找答案。 在使用 scipy 之前,需要引进它,语法如下:

import scipy

这样你就可以用 scipy 里面所有的内置方法 (build-in methods) 了,比如插值、积分和优化。

numpy.interpolatenumpy.integratenumpy.optimize

但是每次写 scipy 字数有点多,通常我们给 scipy 起个别名 sp,用以下语法,这样所有出现 scipy 的地方都可以用 sp 替代。

import scipy as sp

SciPy 是建立 NumPy 基础上的,很多关于线性代数的矩阵运算在 NumPy 都能做,因此就不重复在这里讲了。此外在〖数组计算之 NumPy (下)〗也说过,数组计算比矩阵计算更通用,

本章换一种写法,我们专门针对科学计算中三个具体问题来介绍 SciPy,它们就是插值 (interpolation)

积分 (integration)

优化 (optimization)

对于以上每一个知识点我都会介绍一个简单例子来明晰 SciPy 里各种函数的用法

和金融相关的实际例子计算远期利率:在零息曲线中插值折现因子

计算期权价格:将期望写成积分并数值求解

配置资产权重:优化「风险平价」模型权重

1.插值

给定一组 (xi, yi),其中 i = 1, 2, ..., n,而且 xi 是有序的,称为「标准点」。插值就是对于任何新点 xnew,计算出对应的 ynew。换句话来说,插值就是在标准点之间建立分段函数 (piecewise function),把它们连起来。这样给定任意连续 x 值,带入函数就能计算出任意连续 y 值。

在 SciPy 中有个专门的函数 scipy.interpolate 是用来插值的,首先引进它并记为 spi。

import scipy.interpolate as spi简单例子

用 scipy.interpolate 来插值函数 sin(x) + 0.5x。

基本概念

首先定义 x 和函数 f(x):

x = np.linspace(-2 * np.pi, 2 * np.pi, 11)f = lambda x: np.sin(x) + 0.5 * xf(x)array([ -3.14159265,  -1.56221761,  -1.29717034,  -1.84442231,

-1.57937505,  0.         ,  1.57937505,  1.84442231,

1.29717034,  1.56221761,  3.14159265])

接下来介绍 scipy.interpolate 里面两大杀器:splrep 和 splev。两个函数名称都是以 spl 开头,全称 spline (样条),可以理解这两个函数都和样条有关。不同的是,两个函数名称以 rep 和 ev 结尾,它们的意思分别是:rep:representation 的缩写,那么 splrep 其实生成的是一个「表示样条的对象」

ev:evaluation 的缩写,那么 splev 其实用于「在样条上估值」

splrep 和 splev 像是组合拳 (one two punch)前者将 x, y 和插值方式转换成「样条对象」tck

后者利用它在 xnew 上生成 ynew

一图胜千言:

161685674_1_20190521062532613

接下来仔细分析一下 tck。

tck = spi.splrep( x, f(x), k=1 )tck

161685674_2_20190521062532722

tck 就是样条对象,以元组形式返回,tck 这名字看起来很奇怪,实际指的是元组 (t, c, k) 里的三元素:t - vector of knots (节点)

c - spline cofficients (系数)

k - degree of spline (阶数)

对照上图,tck 确实一个元组,包含两个 array 和一个标量 1,其中第一个 array 是节点,即标准点,注意到一开始 x 只有 11 个,但现在是 13 个,首尾都往外补了一个和首尾一样的 x

第二个 array 是系数,注意它就是 y 在尾部补了两个 0

标量 1 是阶数,因为在调用 splrep 时就把 k 设成 1

注:前两个 array 我只是发现这个规律,但解释不清楚为什么这样。它和 matlab 里面的 spline() 的产出不太一样,希望懂的读者可以留言区解释一下。

虽然解释不清楚前两个 array,那就把 tck 当成是个黑匣子 (black-box) 直接用了。比如可用 PPoly.from_spline 来查看每个分段函数的系数。

pp = spi.PPoly.from_spline(tck)pp.c.Tarray( [[ 1.25682673, -3.14159265],

[ 1.25682673, -3.14159265],

[ 0.21091791, -1.56221761],

[-0.43548928, -1.29717034],

[ 0.21091791, -1.84442231],

[ 1.25682673, -1.57937505],

[ 1.25682673, 0. ],

[ 0.21091791, 1.57937505],

[-0.43548928, 1.84442231],

[ 0.21091791, 1.29717034],

[ 1.25682673, 1.56221761],

[ 1.25682673, 3.14159265]])

t ck 的系数数组里有 13 个元素,而上面数组大小是 (12, 2),12 表示 12 段,2 表示每段线性函数由 2 个系数确定。

把 x 和 tck 丢进 splev 函数,我们可以插出在 x 点对应的值 iy。

iy = spi.splev( x, tck )iyarray([ -3.14159265,  -1.56221761,  -1.29717034,  -1.84442231,

-1.57937505,  0.         ,  1.57937505,  1.84442231,

1.29717034,  1.56221761,  3.14159265])

用 Matplotlib 来可视化插值的 iy 和原函数 f(x) 发现 iy 都在 f(x) 上。Matplotlib 是之后的课题,现在读者可忽略其细节。

161685674_3_20190521062532769

161685674_4_20190521062532800

除了可视化,我们还可以用具体的数值结果来评估插值的效果:

np.allclose(f(x), iy)np.sum((f(x) - iy) ** 2) / len(x)True

0.0

第一行 allclose 的结果都是 True 证明插值和原函数值完全吻合,第二行就是均方误差 (mean square error, MSE),0.0 也说明同样结果。

上面其实做的是在「标准点 x」上插值,那得到的结果当然等于「标准点 y」了。这种插值确实意义不大,但举这个例子只想让大家明晰 splrep 和 splev 是怎么运作的

如何可视化插出来的值和原函数的值

如何用 allclose 来衡量插值和原函数值之间的差异

一旦弄明白了这些基础,接下来就可以秒懂更实际的例子了。

正规例子

上面在「标准点 x」上插值有点作弊,现在我们在 50 个「非标准点 xd」上线性插值得到 iyd。

xd = np.linspace( 1.0, 3.0, 50 )iyd = spi.splev( xd, tck )print( xd, '\n\n', iyd )

161685674_5_20190521062532832

密密麻麻的数字啥都看不出来,可视化一下把。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pythonscipy教程_Python学习教程(Python学习路线):Python—SciPy精讲 的相关文章

  • @Transactional 失效问题

    Transactional配置起来是简单方便 但是坑也相当多 下面就记录下这些坑 1 service类标签添加在了接口上 查阅资料说接口的方法上可以加也不建议这样用 但实际中这么出现事务失效 2 Transactional 注解只能应用到
  • CSS3 - flex属性

    前言 CSS属性 flex 规定了弹性元素如何伸长或缩短以适应flex容器中的可用空间 这是一个简写属性 用来设置 flex grow flex shrink flex basis flex grow 属性 定义项目的放大比例 默认为0 即
  • MongoDB max 获取最大值 (Golang)

    某个集合 要获取某个字段的最大值 有两种办法 一个是用sort 另一个是用聚合 Aggregate 下面是代码演示 sort var ID uint64 func initIDEx clientOptions options Client
  • count(distinct 多个字段)

    select count distinct col1 col2 col3 from table 但是 这样是不允许的 因为count是不能统计多个字段的 虽然distinct是可行的 有种比较直接的方法就是把消除重复后在统计查询 selec
  • ubuntu 20.4 + openswan 实现点对点VPN

    需求背景 多个IDC机房或者办公地点 不同地址位置 用linux系统和软件 组一个局域网 共享网络资源 需求环境 ubuntu 20 4 openswan 实现点对点VPN 需要技能 熟悉ubuntu 会用日常网络指令 了解网络结构 理解私
  • 使用C++实现Flutter Windows插件

    上周实现的Flutter条形码插件已经发布到https pub dev packages flutter barcode sdk 平台相关部分只包含了Android的Java代码 这周新增用于Windows的C 代码 后续计划还包含iOS和
  • 关于scrapy网络爬虫的xpath书写经验总结

    借助于scapy的爬虫框架 能方便实现低网络数据的爬取 其中xpath如何写法 对元素的定位在爬取过程中起着至关重要的作用 以下是对xpath写法的一些经验 1 优先遵循 自底向上 原则 即从所要爬取的字段节点出发 层层向上 向父节点去遍历
  • 判断App版本号

  • 各个硬件的工作原理

    前情回顾 主存储器的基本组成 存储体 用于存放数据的东西 由一系列的存储元件构成 可以存放二进制的 0 和 1 运算器的基本组成 控制器的基本组成 计算机的工作过程 案例分析 执行指令0 执行指令1 执行指令2 执行指令3 执行指令4 总结
  • Pytorch 提取权重等参数 写入Excel

    Pytorch 提取权重等参数 写入Excel表 标签 Pytorch Topic 网络参数导出 时间 2022 5 27 写在最前 最近有在做量化相关的东西 不确定是不是我这边没设置好怎么 量化后只给出了相应层的s z值 这里就需要将网络
  • JavaWeb-Filter过滤器

    Filter过滤器是JavaWeb的三大组件之一 Filter过滤器是JavaEE的规范也就是接口 Filter的作用是拦截请求 过滤响应 拦截请求常见的应用场景 权限检查 日志操作 事务管理等等 Filter过滤器的基本使用 例如权限检查
  • Activity沉浸式

    沉浸式依赖 implementation com gyf immersionbar immersionbar 2 3 3 beta05 ImmersionBar with this transparentStatusBar 透明状态栏 不写
  • go 源码分析string、[]byte的相互转换

    string 简单的来说字符串是一系列8位字节的集合 通常但不一定代表UTF 8编码的文本 字符串可以为空 但不能为nil 而且字符串的值是不能改变的 不同的语言字符串有不同的实现 在go的源码中src runtime string gos
  • 怎么阅读源码【调试观察源码】

    读源码需要掌握的编译器知识 编译器为eclipse为例子 调试准备工作 步骤 Window gt Show View 打开调试断点Breakpoint 打开变量监视 要看一个方法的内部细节 按f5 进入 要快速跳到某个位置 在目标位置上打个
  • 【蓝桥杯嵌入式最全备考资料】真题、代码、原理图、指导手册、资源包等

    目录 前言 公众号回复 蓝桥杯 获取全部资料 欢迎大家过来关注一起玩呀 一 蓝桥杯嵌入式省赛个人总结的模板流程 十四届模拟试题 详解 超详细 二 第六 十四届省 国赛真题 主观题 客观题 三 蓝桥杯 全国软件和信息技术专业人才大赛实训指导书
  • C#中this的 四种 用法

    C 中的this用法 相信大家应该有用过 但你用过几种 以下是个人总结的this几种用法 欢迎大家拍砖 废话少说 直接列出用法及相关代码 this用法1 限定被相似的名称隐藏的成员
  • WIN10与VMware中的Ubuntu20.04.3系统文件共享(可视化界面居多、无脚本)

    1 在WIN10本地创建一个用于共享的文件夹 2 安装VMware Tools并完成配置 3 开启 共享文件夹
  • 我用了两年时间去读《Thinking in Java》

    路漫漫其修远兮 吾将上下而求索 题记 我用了两年时间去读 Thinking in Java 无论在学校还是在工作 都能听到过来人说 Java编程思想是一本经典著作 于是乎在工作以后 我就买了一本来看看 后来呢 在这断断续续两年时间 精读略读
  • 域名反查、权重查询以及ICP备案查询——ipInfoSearch

    域名反查 权重查询以及ICP备案查询 ipInfoSearch ipInfoSearch 一 配置需要python三方包 二 基本用法 三 多线程用法 文中工具已上传至github https github com Potato py ip

随机推荐

  • 时域和空域和频域

    傅立叶变换是f t 乘以正弦项的展开 正弦项的频率由u 其实是miu 的值决定 因为积分后左边剩下的为一变量是频率 所以我们说傅立叶变换域是频率域 数字图像处理 冈萨雷斯 中文第三版P128 当变量t用于说明图像时 我们一般将变量t的域称为
  • [Python人工智能] 四.神经网络和深度学习入门知识

    从本篇文章开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前三篇文章讲解了神经网络基础概念 Theano库的安装过程及基础用法 theano实现回归神经网络 theano实现分类神经网络 这篇文章又回到基础知识 结合
  • Chromedriver安装教程【无需翻墙】

    第一步 查看你当前Chrome浏览器的版本 如下图所示 第二步 查看当前Chrome浏览器的版本号 如下图所示 版本 108 0 5359 125 正式版本 64 位 中的 108就是我们的版本号 第三步 到谷歌驱动下载地址 https n
  • spring全家桶

    目录 一 Spring基础 1 Spring的核心模块 2 Spring中用到的设计模式 3 Spring SpringMVC SpringBoot SpringCloud 二 SpringIOC 1 IOC的理解 2 Spring中的循环
  • java基础

    java简介 Java是一门面向对象的编程语言 不仅吸收了C 语言的各种优点 还摒弃了C 里难以理解的多继承 指针等概念 因此Java语言具有功能强大和简单易用两个特征 Java语言作为静态面向对象编程语言的代表 极好地实现了面向对象理论
  • psql的使用与常用参数

    使用psql时默认使用安装数据库时的用户登录 端口默认5432 默认连接数据库是用户名db 使用默认用户登录时是超级用户 不需要密码 但是第一次登录会因为未创建该用户名的数据库而登录失败 首次登录需要手动创建用户名数据库或者选择默认的pos
  • Linux中source命令的用法

    source命令 source命令也称为 点命令 也就是一个点符号 source命令通常用于重新执行刚修改的初始化文件 使之立即生效 而不必注销并重新登录 用法 source filename 或 filename source命令除了上述
  • BUUCTF 之 [ACTF2020 新生赛]Exec(命令执行漏洞)

    BUUCTF 之 ACTF2020 新生赛 Exec 命令执行漏洞 相关 观察 进攻 相关 项目 内容 难度 简单 类型 WEB 靶场 BUUCTF 坐标 Exec 观察 这界面和这网页标题结合起来 相信给位都能猜到这个靶场中很有可能存在命
  • 类和对象的学习

    类和对象的学习 1 什么是类 class 就是声明一个类 概念 一类事物的总体描述 及该事物包含方法的总称 属性 描述这个事物的 方法 这个事物特有的行为 定义一个学生类 属性 名字 年龄 性别 方法 吃饭 睡觉 学习 打游戏 2 封装一个
  • 《创新创业实训》网课答案解析

    创新创业实训 网课答案解析 一 网课的简单介绍 二 部分习题的展示 三 获取全部内容 一 网课的简单介绍 创新创业实训 是我之前选的一门网课 由于其比较小众 所以很多课后题很难在网上找到答案 为了帮助后续选择这门课的同学 这里我将该网课所涉
  • Zabbix--API接口

    一 API的简单介绍 Zabbix API允许你以编程方式检索和修改Zabbix的配置 并提供对历史数据的访问 1 应用 1 创建新的应用程序以使用Zabbix 2 将Zabbix与第三方软件集成 3 自动执行常规任务 2 意义 abbix
  • RabbitMQ多种问题出现的解决方案

    消息丢失 1 只要订单完成我们就会发送一条消息给MQ 这个途中突然MQ服务器网络中断 导致消息无法抵达 做好容错方法需要在消息发送前加上异常处理 try rabbitTemplate convertAndSend order event e
  • 区间和

    模板 模板来自AcWing vector
  • IDEA中新建一个java类,无法实现Servlet接口或者继承HttpServlet类

    有道云笔记链接可查看 IDEA中新建一个java类 无法实现Servlet接口或者继承HttpServlet类 问题描述 新建一个java类 无法实现Servlet接口或者继承HttpServlet类 原因 缺少tomcat的librari
  • SQL每日一练(牛客新题库)——第2天: 条件查询

    文章目录 1 查找后排序 2 查找后多列排序 3 查找后降序排列 4 查找学校是北大的学生信息 5 查找年龄大于24岁的用户信息 6 如何让刷题变得更高效 1 查找后排序 题目 现在运营想要取出用户信息表中的用户年龄 请取出相应数据 并按照
  • linux日志系统介绍 —— syslog(),openlog(),closelog()

    函数使用介绍 这里面的三个函数openlog syslog closelog是一套系统日志写入接口 另外那个vsyslog和syslog功能一样 仅仅是參数格式不同 通常 syslog守护进程读取三种格式的记录消息 此守护进程在启动时读一个
  • 毕业两年月薪36k,有时候人与人的差距比人和狗还大

    想起两年前交流过的一个应届生 当时他刚毕业技术水平不高 进了一个小公司做Java后端实习工作 最近联系上了 不问不知道 一问吓一跳 他现在已经进了某一线大厂 月薪36K 这位朋友其实也没比别人强多少 关键在于面试前做足了准备 许多人迫切需要
  • 有序表的合并

    目录 前言 一 有序表合并的两种方式 二 两种实现方式的具体操作 1 顺序表 2 链式 三 两种实现方式的比较 四 总结 前言 通过对线性表的学习 我们对其相关概念已经一定的认识 下面我们通过一些简单的实例应用来增进对线性表相关知识的认识并
  • Synthtext 数据集

    Synth text 数据集官网下载的主要包含图像文件夹和gt mat标注文件 共85万 858750 多张图片数据 该数据集中包含了词级别标注 字符级别标注和文本识别内容 可用于文本检测和文本识别模型 1 mat格式标注文件读取 采用sc
  • pythonscipy教程_Python学习教程(Python学习路线):Python—SciPy精讲

    SciPy 是 Python 里处理科学计算 scientific computing 的包 使用它遇到问题可访问它的官网 https www scipy org 去找答案 在使用 scipy 之前 需要引进它 语法如下 import sc