SciPy是Python编程语言的一个数学程序库,它为建模和解决科学问题提供了构建块。SciPy包括优化、积分、插值、特征值问题、代数方程、微分方程和许多其他类问题的算法;它还提供特殊的数据结构,如稀疏矩阵和k-维树。SciPy是建立在NUMPY之上的,它提供了array数据结构和相关的快速的数学程序,而SciPy本身就是构建更高级别的科学库的基础,包括scikit-learn和scikit-image。在这篇文章中,我们概述了SciPy 1.0的功能和开发实践,并重点介绍了最近的一些技术进展。
截至2019年2月,SciPy库包含将近600,000行开源代码,这些代码按图1汇总的16个子包进行组织。开发团队和社区目前主要在GitHub上进行交互和操作,这是一个在线版本控制和任务管理平台。超过110,000个GitHub存储库和6,500个软件包依赖SciPy。
图1:SciPy包组织
一、架构和实现
1.1 项目范围
SciPy提供了用于科学计算的基本算法。在发展相对较缓慢的领域,SciPy旨在提供完整的覆盖范围。在其他领域,SciPy的目的是提供基本的构建块,同时与该领域的其他包进行良好的交互。例如,SciPy提供了概率分布,假设检验,频率统计,相关函数等,而Statsmodels提供了更高级的统计估计量和推断方法,scikit- learn3涵盖了机器学习,而PyMC3,emcee和PyStan (http://mc-stan.org) 涵盖了贝叶斯统计和概率建模。scikit-image4提供了比SciPy的ndimage模块更加优秀的的图像处理功能,SymPy提供了用于符号计算的Python交互界面,而sparse. csgraph和spatial与诸如NetworkX之类的专用库相比提供了与图形和网络一起使用的基本工具。
我们使用以下标准来确定是否要在SciPy中加入新特征:
•该算法与多个科学领域相关。
•该算法非常重要。例如,它足够经典,可以包含在教科书中,或者基于经过大量同行引用的同行评审文章。
在软件系统和体系结构方面,SciPy的范围与NumPy的范围相匹配。
1.2 语言选择
根据linguist库 (https://github.com /github/linguist) 的分析,SciPy大约是Python占50%,Fortran占25%,C占20%,Cython占3%和C ++占2%,以及少量的TeX, Matlab,shell 脚本和Make。
尽管Fortran已有很长的历史,但它仍然是一种高性能的科学编程语言。因此,我们包装了以下出色的且经过实测的Fortran库,以在为Python带来便利的同时提高性能:QUADPACK和ODEPACK用于数值积分和初值问题的解决;FITPACK,ODRPACK和MINPACK用于曲线拟合和最小二乘最小化;FFTPACK用于执行傅立叶变换;ARPACK用于解决特征值问题;用于计