SciPy是面向Python语言的开放源代码科学计算库,发音为「Sigh Pie」,包含统计、优化、积分、线性代数、傅里叶变换、信号与图像处理、常微分方程求解等多个模块[1]。它以NumPy提供的多维数组为基本数据结构,把用C、Fortran等编译型语言编写的高性能数值过程封装为Python可调用的接口,使交互式Python环境具备与MATLAB、GNU Octave等系统相近的数据处理与原型开发能力。该库采用BSD许可证发布,由社区开发者共同维护,是科学Python生态的基础组件之一。
定义
SciPy是构建在NumPy之上的数学算法与常用函数集合,为Python补充了大量面向科学计算的高级命令和类,使用户能够在交互式会话中直接操作与可视化数据。它的定位并非单一算法,而是一组按学科领域划分的子程序包,官方文档将其描述为「Python中科学计算的基础算法」[2]。
在英文语境中,SciPy一词同时指代几个相关而有区别的事物:一是包含NumPy、SciPy库、Matplotlib等在内的SciPy生态,二是使用与开发这套技术栈的社区,三是与之相关的会议,四是其中提供大量数值例程的SciPy库本身[3]。中文语境下通常取最后一层含义,即那个可通过import scipy调用的算法库。
该库与NumPy分工明确:NumPy负责定义多维数组与矩阵类型及其基本运算,SciPy则在此基础上提供信号处理、优化、统计等领域的专用工具箱[3]。SciPy的官方资料中也指出,NumPy虽含有线性代数、傅里叶变换与随机数生成方面的函数,但其通用性不及SciPy中的对应函数[4]。
原理
SciPy的核心数据结构来自NumPy的多维数组。数组把一批同类型数值连续存放,使循环运算可以在编译层面完成,从而避免Python解释器逐元素执行带来的开销;SciPy的算法即建立在这种数组对象之上,对整块数据施加操作[4]。
性能的实现方式是把运算下沉到编译代码。SciPy封装了用Fortran、C和C++编写的高度优化实现,让使用者在保留Python语法灵活性的同时获得编译代码的运行速度[2]。这些底层代码通常链接到BLAS与LAPACK等线性代数库,后者凝聚了数十年的数值方法研究成果[5]。
组织上,SciPy由若干子包构成,需要分别导入,例如from scipy import linalg, optimize。各子包覆盖不同科学计算领域:cluster对应聚类算法,constants提供物理与数学常数,fft与fftpack对应傅里叶变换,integrate负责积分与常微分方程求解,interpolate处理插值与样条,linalg处理线性代数,ndimage处理N维图像,optimize负责优化与求根,signal处理信号,sparse处理稀疏矩阵,spatial提供空间数据结构与算法,special提供特殊函数,stats提供统计分布与函数。
由于这些函数使用频繁,SciPy把其中一部分直接暴露在scipy命名空间顶层,同时NumPy中的许多基本数组函数也可从scipy顶层访问,方便交互式使用。
发展历程
SciPy的源头可追溯到20世纪90年代。当时已出现用于数值计算的数组类型Numeric,由Jim Hugunin于1995年编写;1998年至2001年间,后来在梅奥诊所攻读博士的Travis Oliphant为便于科研使用而扩展了Numeric,同一时期在杜克大学读研究生的Eric Jones也做了类似工作[6]。爱沙尼亚博士生Pearu Peterson则发布了用于绑定Python与Fortran代码的命令行工具P2PY,并编写了线性代数与插值模块;在哈佛医学院做博士后的Gary Strangman也发表了若干统计推断例程[7]。
2001年,Eric Jones与Travis Vaught在美国得克萨斯州奥斯汀创办Enthought Scientific Computing Solutions,随后创建SciPy项目,合并了上述分散的代码成果[7]。项目网站与代码仓库在当年2月上线,邮件列表于6月公布,8月发布首个版本,9月发布第一份文档;首次SciPy研讨会于2002年9月在加州理工学院举行,参加者约50人,其中不少是SciPy及周边库的开发者[7]。中文资料亦记载,2001年Travis Oliphant、Eric Jones与Pearu Peterson合并各自编写的代码,并以SciPy为名发布[4]。
2005年前后,合并Numeric与numarray的努力进入关键阶段。Travis Oliphant吸收两者优点,NumPy 1.0于2006年10月发布,统一了科学Python社区所使用的数组核心[7]。2005年在伯克利的一次会议聚集了John Hunter(matplotlib)、Fernando Perez(IPython)、Travis Oliphant以及来自空间望远镜研究所的Perry Greenfield等人,讨论内容包括统一到单一数组核心、围绕该核心重构SciPy,以及把SciPy看作更大生态的基础而非单一巨型库[8]。
2000年代中后期,SciPy进入成熟期:库自身的范围收窄,而生态的广度通过scikit这类外部补充库扩展;工具链、开发流程、文档与发布流程也趋于专业化[7]。SciPy会议自2007年前后由小型研讨会逐步发展为设有同行评议论文的国际会议,并催生了2012年成立的NumFOCUS等社区基础设施[8]。
应用
SciPy的算法与数据结构适用于多种领域,官方将其功能概括为优化、积分、插值、特征值问题、代数方程、微分方程、统计等类别的求解[2]。在工程与科研中,它常被用于数值积分与优化一类任务,并被认为是可与MATLAB或GNU Octave提供部分相当功能的工具[5]。
图像处理是其中一个具体方向。scipy.ndimage子模块面向N维NumPy数组提供操作函数,而图像本身即可视为多维数组,因此该模块可用于图像的基本处理与变换[9]。
在更广的生态中,SciPy与Matplotlib、pandas、SymPy、scikit-learn、scikit-image、NetworkX等库共同构成科学Python工具栈,分别覆盖绘图、数据结构、符号计算、机器学习、图像处理与复杂网络分析等用途[3]。神经影像领域在2000年代中期提出以Python重写分析工具的设想,并由此形成Neuroimaging in Python项目,其实现即依托NumPy、SciPy与matplotlib[8]。
局限
作为高层库,SciPy的运算速度在极端苛刻的计算任务或大规模数据处理场景下可能不及底层实现或专用工具;由于其性能上限受NumPy制约,后者的限制也会传导至SciPy[9]。SciPy内部对函数输入做校验,而NumPy在某些路径上不做检查,这种差异会带来额外的性能开销,官方议题中即记录过scipy.linalg.solve比np.linalg.solve慢约50%的情形[10]。
跨平台构建曾长期是薄弱环节。SciPy在Windows上的处境比NumPy更困难,因为它还需要Fortran编译器,当时实际可用的构建工具主要是Intel编译器与MKL,而后者用于二进制分发需要非自由授权[11]。Windows缺少默认的BLAS与LAPACK优化库,若没有这类库,SciPy编译会直接失败[12]。
二进制分发的性能也受到取舍影响。自NumPy 1.10.4与SciPy 1.0.0起,各主要操作系统在PyPI上开始提供wheel格式的预编译32位与64位二进制包,但在Windows平台上,相关二进制链接的是仅支持SSE2指令集的ATLAS库,因而线性代数性能未必最优[13]。此外,由于SciPy功能覆盖面广,初学者在没有科学计算基础时可能感到上手困难[9]。
参见
-
NumPy —— SciPy所依赖的多维数组库,为其提供基本数据结构与基础运算。
-
Matplotlib —— 科学Python工具栈中的绘图库,常与SciPy配合完成结果可视化。
-
pandas —— 提供高性能数据结构的库,与SciPy同处科学Python生态。
-
scikit-learn —— 建立在科学Python栈之上的机器学习算法库。
-
Fortran —— SciPy底层大量数值过程所使用的编程语言之一。
-
Enthought —— 最初创建并资助SciPy项目的公司。
参考资料
- pypi.org 上的网页 [引用日期2026-10-14]
- SciPy 科学计算库 [引用日期2026-10-14]
- Scientific computing tools for Python¶ [引用日期2026-10-14]
- SciPy [引用日期2026-10-14]
- python-community [引用日期2026-10-14]
- Origins of SciPy and NumPy [引用日期2026-10-14]
- ac.at 上的文件 [引用日期2026-10-14]
- pretalx.com 上的网页 [引用日期2026-10-14]
- SciPy VS Burla - compare differences & reviews? [引用日期2026-10-14]
- github.com 上的网页 [引用日期2026-10-14]
- Re: [SciPy-Dev] win32 binaries and scipy 0.17.0 release [引用日期2026-10-14]
- Whats with Windows builds [引用日期2026-10-14]
- Installing scientific packages¶ [引用日期2026-10-14]