科学计算库 SciPy 的前世今生

Python科学计算:SciPy与SymPy库 SciPy是基于NumPy构建的一个开源Python库,用于数学、科学和工程领域的数值计算。它提供了许多高效的数值算法,如优化、线性代数、积分、插值、特殊函数等。SymPy是一个Python的符号数学库,支持符号表达式的化简、求导、积分、解方程等操作。它旨在成为功能齐全的计算机代数系统(CAS),同时保持代码的简洁性和可读性。 阅读详情

点击上方“编程派”,选择设为“设为星标”

优质文章,第一时间送达!


本文分享自机器之心公众号,作者:机器之心编辑部

每年千万下载量,科学计算开源库 SciPy,你已经是个成熟的小伙伴了。

作为科学计算中的中流砥柱,SciPy 从 2001 年到现在已经走过了十九个年头,它为最优化、积分、微分方程等各种数值计算提供了完整的流程,也为科研分析人员提供了最好用与高效的开源库。

前天 2 月 3 日,SciPy 的维护者在 Nature Methods 上发表了一篇论文,其回顾了 SciPy 发展的里程碑与关键技术。并借助 SciPy 1.0 这个成熟的象征,展现了当前科学计算以及未来发展方向都是什么样的。

  • 论文地址:

    https://www.nature.com/articles/s41592-019-0686-2

  • SciPy 项目地址:

    https://github.com/scipy/scipy

为什么 SciPy 那么重要?

 SciPy 是一个面向 Python 的开源科学计算库。自 2001 年首次发布以来,SciPy 已经成为 Python 语言中科学算法的行业标准。该项目拥有超过 800 个独特的代码贡献者,数以千计的相关开发包,和超过 150,000 个依赖存储库以及每年数以百万计的下载量。在下述简介中,会概述 SciPy 1.0 的功能和开发实践,并着重阐述一些最新的技术发展与更新。(注:数据更新来自 Github 最新反馈)

SciPy 是一个基于 Python 和 Numeric 的开源代码包,当前模块集包括了上图中的内容。

项目覆盖范围

SciPy 提供了科学计算的基本算法,这些算法涵盖了现有数学软件分类系统中的算法。在迭代相对缓慢的领域(如:线性代数),SciPy 旨在提供完整的算法覆盖。

而在其他领域,它提供基本的构件,并与该领域的其他软件包进行良好的互动于兼容。例如,SciPy 提供了人们期望在统计学教科书中能找到的基本算法(概率分布、假设检验、频率统计、相关函数等),但 Statsmodels 提供了更先进的统计预估及推断方法。虽然 scikit-learn 涵盖了机器学习,但 PyMC、emcee 和 PyStan 涵盖了贝叶斯统计和概率建模等。

SciPy 能干什么

我们知道 SciPy 是一个用于数学、科学、工程领域的常用库,可以处理插值、积分、最优化、常微分方程数值解的求解、信号处理等问题。因此自然科学领域绝大多数涉及计算的工作都能用它来完成,例如我们熟知的统计学习,拟合个分布、做了 K 最近邻算法都是非常便捷的。

当然目前新冠肺炎疫情广受关注,研究者也可以用它模拟各种关键信息。例如之前中国疾病预防控制中心、国内各省市疾控中心等机构在新英格兰医学杂志发表的《新型冠状病毒肺炎在中国武汉的早期传播》论文。

在获取数据之后,进行各种统计学分析很多都可以用 Scipy 完成,具体而言:

  • 研究者根据发病日期构建传染曲线;

  • 使用对数高斯分布拟合暴露历史和发病日期数据,估计潜伏期分布;

  • 使用韦伯分布拟合发病日期、首次就诊日期和住院日期,并估计发病离就诊的时间间隔分布、发病离住院的时间间隔分布;

  • 使用伽玛分布拟合病例集群数据,从而估计人际传播的时间间隔(serial interval)分布。

这些分析任务主要在于利用统计分布拟合对应的数据,该肺炎论文的研究者采用 MATLAB 做的拟合。但实际上,scipy.status 包含了 100 多个概率分布,这些统计分析也能通过 SciPy 完成。

面对汹涌的疫情,不论我们是有第一手数据,还是从各网站爬取疫情信息,利用 SciPy 建模与分析都是非常好的选择。

SciPy 发展里程碑

20 世纪 90 年代末期,美国梅奥医学中心的博士生 Travis Oliphant 发布了一系列构建于数值数组之上的包,并提供了用于信号处理、特殊函数、稀疏矩阵、正交、最优化和快速傅里叶变换等的算法。

这些包中的 Multipack 是一组包装了 Fortran 和 C 语言的扩展模块,用于解决非线性方程和最小二乘问题、求微分方程的积分以及拟合曲线。

随后,编程环境愈加丰富,也具备了适当的数值数组对象,开发全栈科学软件的时机成熟了。2001 年,Eric Jones 和 Travis Vaught 创建了 Enthought 科学计算解决方案。

之后,为了简化工具堆栈,他们创建了以 SciPy 库为中心的 SciPy 项目。该项目的发展势头很猛,2001 年 2 月推出网站和代码库,6 月宣布邮件列表,8 月推出了 SciPy 0.1 版。

SciPy 早期版本的文档较少,但随着 2006 年发布 Numpy 指南(Guide to Numpy),这种情况开始改变。2007 年,Sphinx 文档生成器使得 SciPy 能够从包含 Python 代码的纯文本中自动呈现超文本和 PDF 文档。2008 年,Pydocweb 工具使得 SciPy 又能够以维基百科的方式进行协作文档开发。

在早期的 SciPy workshop 中,反复出现的一些主题反映了 SciPy 的开发状态,它将重心放在了底层数组包、绘图、并行处理、加速/包装和用户界面上。到了 2004 年,关于 SciPy 应用于科学计算问题上的内容开始出现。

图 1:自 2001 年发布 0.1 版到 2017 年推出 1.0 版本,SciPy 发展过程中的一些里程碑式事件。

SciPy 近三年的关键技术

从 2001 年发布的 0.1,到近几年发布成熟版的 SciPy 1.0,最近三年 SciPy 在科学计算上有了更多的技术累积。我们可以用更少的算力运行更大的矩阵计算,用更精简的方式拟合更复杂与多样的概率分布,也可以跑一跑最新的最优化方法。研究者在这篇论文中着重介绍了 SciPy 一路走来的关键技术。

数据结构:稀疏矩阵

scipy.sparse 提供了 7 种稀疏矩阵数据结构,或者称之为稀疏格式。其中最重要的一种是压缩行/压缩列的稀疏格式,它们分别为 CSR 与 CSC。这两种方法都提供了快速的主轴索引与快速的矩阵-向量乘法,这两种稀疏格式在 SciPy 及依赖的库中得到了广泛的应用。

从新特性的角度来看,scipy.sparse 矩阵与线性运算子现在都已经支持 Python 矩阵乘法(@)。

cKDTree

scipy.spatial.ckdtree 模块实现了空间分割的数据结构,该结构会在 K 维空间中组织数据点。整个 cKDTree 模块通过模板化类用 C++重写了,并新增对周期性边界条件的支持,它经常用于物理过程的模拟。

2013 年,基于 cKDTree.query 的 K 最近邻算法时间复杂度逼近了对数线性。2015 年,cKDTree 二元树计数算法通过加强以支持加权,这对于很多科学应用来说都是非常重要的,例如计算星系的相关性函数。

统一捆绑到已编译代码:LowLevelCallable

到了 SciPy 0.19,用户就可以直接使用 scipy.LowLevelCallable 对象包装底层函数,从而减少直接从 Python 调用已编译 C 函数的开销,这种编译的 C 函数可能是由 Numba 或 Cython 生成的。

数学优化

scipy.optimize 子包提供了数学解决方案,用于解决多种类型的「root finding」和优化问题。

研究者在表 1 中详细比较了所有最小化方法的特征,这些特征说明了 SciPy 如果要达到比较完整的水平,它需要涵盖的数值方法或主题。

统计分布

scipy.status 包含了 100 多个概率分布:96 个连续分布和 13 个离散单变量分布,以及 10 个多变量分布。该实现依赖于一个一致的框架,该框架提供了抽样随机变量的方法,用以评估累积分布函数指数(CDF)和概率密度函数指数(PDF),并适合每一个分布的参数。

测试套件

在更改代码时,测试驱动的开发被认为是一种管理不确定性的方法。对于 SciPy 的每个组件,研究者都编写了多种能够验证它们预期行为的可执行小测试。这些可执行小测试的集合被称为『测试套件』,增强了对正确性和准确度的置信度,并允许用户在修改已有代码时不会改变预期行为。

图 2:不同版本 SciPy 中的 Python 和编译代码量。

除了保证单元测试通过之外,重要的是确保 SciPy 代码库的性能能够随时间推移而提升。比如,下图 3 展示了在大约 9 年的项目发展历程中,scipy.spatial. cKDTree.query 的性能提升情况。

图 3:从 cKDTree 的提出到 SciPy 1.0 的发布,scipy.spatial.cKDTree.query 的基准测试的结果。图中的每个标记表示 SciPy 主分支中提交的基准测试的执行时间。

SciPy 仍在路上

SciPy 项目每 6 个月进行一次更新。任何感兴趣、有技术能力的开发者都可以参与贡献代码。虽然 SciPy 的研发成本已经超过了 1 千万美元,但是项目依然是没有资金支持的。这些代码都是由大学研究生、学术界和工业界的人们在闲暇时间完成的。

SciPy 有着一个很大的开发社区,用户基数也很庞大。在 2017 年,通过 PyPI 下载的次数是 13,096,468 次,而通过 conda 下载的次数则有 5,776,017 次。

尽管如此,SciPy 依然在继续进步。下图的表格是一个持续更新的文档,描述了团队正在项目中进行改进和提升的工作。这份文档也提到了一些需要改进的地方。

回复下方「关键词」,获取优质资源

回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版

回复关键词「入门资料」,立即获取主页君整理的 10 本 Python 入门书的电子版

回复关键词「m」,立即获取Python精选优质文章合集

回复关键词「book 数字」,将数字替换成 0 及以上数字,有惊喜好礼哦~

题图:pexels,CC0 授权。

好文章,我在看❤️

Python SciPy 核心模块【开源科学计算库】全面讲解 构建的开源科学计算库,提供高效数值计算、优化、统计、信号处理等高级功能。通过掌握这些模块,你可高效解决科学研究与工程中的复杂数值问题。核心模块的全面讲解,包含关键功能及代码示例。 阅读详情

相关推荐

GSL开源科学计算库

gsl是GNU的一个开源科学计算库,c语言的。不过感觉使用人群小了点,最近一次更新是在2011年。GNU的项目有好多是费了的。这里提供下载。

scipy.spatial.cKDTree

类cKDTree的简介

gougou0304的博客 2680

Arduino程序设计(十四)舵机控制实验(SG90)

本文介绍SG90舵机控制原理及实验,主要内容有:1、介绍SG90舵机;2、舵机0°~180°来回转动;3、串口控制舵机转动固定角度。(1)舵机是一种位置(角度)伺服的驱动器。舵机只是一种通俗的叫法,其实质是一个伺服马达。在需要角度不断变化并可以保持的控制系统中应用广泛。如遥控机械人、飞机模型等。(2)舵机的转动角度为0~180°,其内部结构包括电机,控制电路和机械结构三部分。电机有三根线引出,分别接VCC、GNG和信号线。

Alice的博客 1万+

scipy.spatial.cKDTree学习

from scipy.spatial import cKDTreeListArray = np.array([[0,0],[1,1],[0,2],[2,2]]) b=np.array(cKDTree(ListArray).query_pairs(r=1.9)) print boutput: set([(0, 1), (1, 2), (1, 3)]) 输出结果表示所有距离小于(r=1.9)的点对,如...

u010949998的博客 1万+

【STM32/GD32】Keil uVision生成bin文件:从编译选项到Bootloader升级实战

本文详细讲解了如何在Keil uVision中配置STM32/GD32工程,使其在编译后自动生成Bootloader升级所需的bin文件。通过解析fromelf工具的使用、构建后命令的配置以及内存布局规划,深入阐述了bin文件在固件升级中的核心作用,并提供了串口Bootloader的实战框架与常见问题解决方案。

weixin_29190169的博客 391

ADNI数据集下载(详细)

刚刚接触到这个数据集的时候比较头疼,用了好长的时间才把下载过程和预处理过程弄明白。需要发送电子邮件给官方平台,收到回信后才能够下载到数据集。 1、ADNI账号注册 第一步:搜索百度打开ADNI 第二步,点击ADTA&SAMPLES 第三步:一直将鼠标往下拉 点击ADNI,进入里面填写信息。需要填写的信息还是挺多的,耐心填写,再等到邮件回复就可以了 2、ADNI数据集下载 登录申请的邮...

蜗牛遥遥 3万+

[QT编程系列-33]:科学计算 - 开源数值计算库GNU Scientific Library(简称GSL)

GNU Scientific Library(简称GSL)是一个开源数值计算库,旨在提供各种数学和科学计算的功能。它用于解决数学、物理、工程和计算科学中的复杂问题,并提供了一组丰富的功能和算法。以下是一些关于GNU Scientific Library的重要信息:功能广泛:GSL提供了许多数学和科学计算的功能,包括线性代数、解析函数、常微分方程、多项式、优化、统计分析、特殊函数等。它还包含一些特定领域的专用模块,如傅里叶变换、数值积分和随机数生成。

文火冰糖(王文兵)的博客 5779

组态王通过以太网与西门子S7-200 SMART PLC通讯案例详解

通过以上步骤,我们成功实现了组态王与西门子S7-200 SMART PLC的以太网通讯。这一技术不仅提高了工业自动化系统的灵活性和可靠性,还为初学者提供了一个实用的学习案例。希望本文能帮助您快速掌握组态王与西门子S7-200 SMART PLC的通讯技术。如有任何疑问,欢迎留言讨论!

2401_88785500的博客 2004

Python中Numpy 和 Scipy的比较

前段时间写了两个系列文章,分别介绍了Python中的两个重要的科学计算的库Numpy和Scipy。从系列的文章中,可以看出,它们都提供了强大的数值计算功能,而且很多地方看着似乎是重复的。其实这两个库虽然密切相关,但它们各自侧重的领域是不同的。本篇我根据自己的使用体验,对两个库进行简单的对比分析。

Saki_Python的博客 1518

pwscf与wannier90 Hands-On实战训练(一)——费米面计算为例

系列文章目录 Quantum Espresso Hands-On实战训练(三)——DOS计算 文章目录系列文章目录计算过程pwscf直接得到等能面pwscf和wannier90得到等能面pwscf直接得到等能面1. scf2. nscf3. 后处理pwscf和wannier90得到等能面1. Kpoints2. scf3. nscf4. pw2wan及wannier90.x5. XCrySDen可视化 计算过程 pwscf直接得到等能面 pwscf和wannier90得到等能面 pwscf直接得到等能面

weixin_45973682的博客 5070

Flutter + shorebird 热更新+自定义cdn下载

本文介绍了如何优化Flutter热更新方案Shorebird在国内网络环境下的使用体验。Shorebird默认使用海外CDN存在下载慢、连接不稳定等问题,建议将补丁包上传至国内CDN(如阿里云OSS)。文章详细讲解了Shorebird环境配置、项目集成、构建发布流程,并重点说明了如何修改客户端代码实现自定义补丁下载逻辑。通过替换默认下载器,将补丁下载地址指向国内CDN,可显著提升下载速度和稳定性。这种方案既保留了Shorebird的热更新能力,又解决了国内网络环境下的痛点,适合国内企业部署使用。

sir_Hu的博客 769

scipy 笔记:spatial.KDTree

用于快速最近邻查找的kd树对于大维数(20已经很大),不要期望这比暴力搜索快很多。高维最近邻查询是计算机科学中一个重大的未解问题。

qq_40206371的博客 1792

1、JMP脚本编程全面指南:从基础到高级应用

本博客全面介绍了JMP脚本编程的各个方面,从JMP基础和JSL入门,到数据类型、数据结构、编程方法、数据表操作、图形与三维场景脚本,再到应用程序创建与扩展功能。内容涵盖脚本工具使用、常见任务实现、兼容性说明及未来发展趋势,旨在帮助用户掌握JMP脚本语言的强大功能,提升数据分析的自动化与定制化能力。适合从初学者到高级用户的深入学习与实践参考。

flink9streamer的博客 266

Py之Scipy:Scipy库(高级科学计算库)的简介、安装、使用方法之详细攻略

Scipy是世界上著名的、开源的高级科学计算库。Scipy是基于Numpy构建的一个集成了多种数学算法和方便的函数的Python模块。通过给用户提供一些高层的命令和类来操作和可视化数据,SciPy在python交互式会话中,大大增加了操作和可视化数据的能力。通过SciPy,Python的交互式会话变成了一个数据处理和一个系统原型system-prototyping环境,可以与MATLAB、IDL、Octave、R-Lab和SciLab等系统相匹敌。

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 14万+

黑猫带你学UFS协议第8篇:UFS电气特性详解(Power、CLK、Reset等)

UFS强制支持secure mode。UFS设备可能会存储个人或者公司的信息,UFS提供把数据永久从设备上移除的功能,并且保证对存储介质进行逆向恢复数据也恢复不回来原有数据。安全模式是以逻辑单元为单位进行应用的,不同的逻辑单元可以有不同的安全模式。由于UFS设备的存储介质不同,所以把数据安全从存储介质上移除方式会有不同,spec提供了三种通用的移除方法,UFS设备至少支持其中一种。● 对存储的位置进行一次擦除操作。● 对存储的位置使用单一字符(比如0xAA)覆盖写,然后进行擦除。.........

黑猫奥利奥的博客 4076

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

python科学计算之SciPy库详解

scipy的使用

GodFatherMisZhao的博客 2608

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Python】科学计算库Scipy简易入门

0.导语Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。Scipy是由针对特定任务的子模块组成:模块名应用领域scipy.cluster向量计算/Kmeansscipy.constants物理和数学常量scipy.fftpack傅立叶变换s...

fengdu78的博客 5061

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Python科学计算库SciPy_python中的scipy库

在使用scipy.optimize模块进行最优化时,我们需要先定义目标函数和约束条件(如果有的话),然后选择合适的优化算法和初始参数值。最后,我们可以调用相应的函数来求解最优化问题,并获取最优解和最优值。除了上述函数,scipy.optimize模块还提供了一些其他的最优化函数,如differential_evolution()、brute()和fmin()。这些函数用于解决全局优化问题,通过搜索参数空间来寻找全局最优解。

m0_61549740的博客 1314

【Python基础】科学计算库Scipy简易入门

0.导语Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Sc...

fengdu78的博客 3070

Python科学计算的利器:Scipy库深度解析

在数据科学、工程计算和数学建模领域,Python的`SciPy`库是不可或缺的强大工具。`SciPy`以`NumPy`为基础,提供了丰富的函数和算法,用于数值积分、优化、线性代数、信号处理等科学计算任务。本文将详细介绍`SciPy`库的核心模块和功能,帮助你深入理解和应用这个库。

萧鼎的博客 1240

【Linux】科学计算环境配置:如何在Linux上配置和使用SciPy、NumPy、Matplotlib等科学计算库

在科学计算和数据分析中,SciPy、NumPy、Matplotlib等Python库非常重要。本文将介绍如何在Linux上配置和使用这些科学计算库,以便进行高效的科学计算和数据分析。

科技改变人类,技术成就未来 1454

SciPy 入门指南:打开 Python 科学计算的大门

SciPy是Python编程语言中一个广泛使用的库,专为科学和工程计算而设计。自从其首次发布以来,SciPy已成为高级数值分析和数据处理的核心工具之一。它提供了一套强大的数学算法和函数,涵盖了从线性代数到优化,从积分到信号处理的多种领域。SciPy的发展始于2001年,由众多科学计算领域的专家共同贡献。作为开源项目,它吸引了全球数以千计的开发者和科学家的关注和参与。SciPy基于NumPy,一个提供高效多维数组操作的库。这种依赖关系使SciPy能够高效地处理大规模的数据集。

walkskyer的博客 1663

Python数据分析库 Scipy:科学计算与数据分析的利器!

Scipy(Scientific Python)在现代科学研究和数据分析中是一个不可或缺的库。它建立在NumPy的基础上,提供了更多的高级科学计算功能,包括优化、信号处理、统计分析、插值、线性代数等。

2201_75362610的博客 7642

Python科学计算库SciPy

SciPy是一个开源的Python科学计算库,提供了一组丰富的数学、科学和工程计算功能。它建立在NumPy之上,与NumPy密切集成,为用户提供了更高级的功能和工具。SciPy库包含了许多模块,每个模块都专注于特定领域的计算任务。

hitpter的专栏 784
上一篇: 10 个PyCharm 高效使用技巧分享
下一篇: 绘制疫情地图必备的一个工具
codingpy
博客等级 码龄11年 1869粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值