常见问题解答

什么是 SciPy?#

SciPy 是一组用于 Python 的开源(BSD 许可)科学和数值工具。它目前支持特殊函数、积分、常微分方程 (ODE) 求解器、梯度优化、并行编程工具、用于快速执行的表达式到 C++ 编译器等。一个很好的经验法则是,如果在一般的数值计算教科书中(例如,著名的《数值食谱》系列)涵盖了某个内容,那么它很可能在 SciPy 中实现。

它要多少钱?#

SciPy 是免费提供的。它作为开源软件分发,这意味着您可以完全访问源代码,并可以在其宽松的 BSD 许可允许的任何方式中使用它。

SciPy 的许可条款是什么?#

根据 BSD 许可条款,SciPy 的许可对于商业和非商业用途都是免费的,此处

如果 SciPy 是用像 Python 这样的解释型语言编写的,它怎么可能如此之快?#

实际上,时间紧迫的循环通常是用 C、C++ 或 Fortran 实现的。SciPy 的某些部分是位于 https://www.netlib.org/ 上免费提供的科学例程之上的薄薄的代码层。Netlib 是一个巨大的存储库,其中包含用 C 和 Fortran 编写的极其有价值且健壮的科学算法。重写这些算法是很愚蠢的,并且需要数年时间来调试它们。SciPy 使用各种方法来生成这些算法的“包装器”,以便它们可以在 Python 中使用。一些包装器是通过手动用 C 编码生成的。其余的则使用 SWIG 或 f2py 生成。SciPy 的一些较新的贡献要么完全用 CythonPythran 编写,要么使用它们包装。

第二个答案是,对于困难的问题,更好的算法可以极大地改变解决问题所需的时间。因此,使用 SciPy 的内置算法可能比用 C 编写的简单算法快得多。

我发现了一个错误。我该怎么办?#

SciPy 开发团队努力使 SciPy 尽可能可靠,但与任何软件产品一样,错误确实会发生。如果您发现影响您软件的错误,请在 SciPy 错误跟踪器中输入一个工单来告诉我们。

如何参与 SciPy?#

请访问我们的社区页面。我们渴望更多人帮助编写代码、测试、文档并帮助维护网站。

是否有商业支持可用?#

是的,许多公司为 SciPy 提供商业支持,例如 AnacondaEnthoughtQuansight

NumPy vs. SciPy vs. 其他软件包#

NumPy 和 SciPy 之间有什么区别?#

在理想的世界中,NumPy 将只包含数组数据类型和最基本的操作:索引、排序、重塑、基本元素函数等。所有数值代码都将驻留在 SciPy 中。但是,NumPy 的重要目标之一是兼容性,因此 NumPy 尝试保留其前身支持的所有功能。因此,NumPy 包含一些线性代数函数和傅里叶变换,即使这些函数更适合放在 SciPy 中。无论如何,SciPy 包含更完整功能的线性代数模块以及许多其他数值算法。如果您正在使用 Python 进行科学计算,您可能应该同时安装 NumPy 和 SciPy。大多数新功能都属于 SciPy 而不是 NumPy。

我如何使用 SciPy 绘制图表?#

绘图功能超出了 SciPy 的范围,SciPy 专注于数值对象和算法。有几个软件包与 SciPy 紧密集成以生成高质量的图表,例如非常流行的 Matplotlib。其他流行的选项包括 BokehPlotlyAltair

我如何使用 SciPy 制作 3D 绘图/可视化?#

与 2D 绘图一样,3D 图形超出了 SciPy 的范围,但与 2D 情况一样,存在与 SciPy 集成的软件包。Matplotlibmplot3d 子包中提供基本的 3D 绘图,而 Mayavi 利用强大的 VTK 引擎提供各种高质量的 3D 可视化功能。

为什么既有 numpy.linalg 又有 scipy.linalg?有什么区别?#

scipy.linalg 是使用 f2py 对 Fortran LAPACK 的更完整的包装。

NumPy 的设计目标之一是使其可以在没有 Fortran 编译器的情况下构建,如果您没有 LAPACK 可用,NumPy 将使用自己的实现。SciPy 需要构建 Fortran 编译器,并且严重依赖于包装的 Fortran 代码。

NumPy 和 SciPy 中的 linalg 模块具有一些通用函数,但文档字符串不同,并且 scipy.linalg 包含 numpy.linalg 中没有的函数,例如与 LU 分解Schur 分解 相关的函数、计算伪逆的多种方法以及矩阵超越函数,例如 矩阵对数。两者中都存在的一些函数在 scipy.linalg 中具有增强的功能;例如,scipy.linalg.eig 可以采用第二个矩阵参数来解决广义特征值问题

Python 版本支持#

NumPy 和 SciPy 仍然支持 Python 2.7 吗?#

支持 Python 2.7 的 NumPy 的最后一个版本是 NumPy 1.16.x。这样做的最后一个 SciPy 版本是 SciPy 1.2.x。第一个支持 Python 3.x 的 NumPy 版本是 NumPy 1.5.0。SciPy 中引入的 Python 3 支持是在 SciPy 0.9.0 中。

SciPy 可以与 PyPy 一起使用吗?#

一般来说,是的。PyPy 最近的改进使得科学 Python 堆栈可以与 PyPy 一起使用。由于 SciPy 的大部分都是作为 C 扩展模块实现的,因此代码可能不会运行得更快(在大多数情况下仍然明显较慢,但是,PyPy 正在积极努力改进这一点)。与基准测试一样,您的经验是最好的指南。

SciPy 可以与 Jython 或 C#/.NET 一起使用吗?#

不,两者都不支持。Jython 从来没有工作过,因为它在 Java 虚拟机之上运行,并且无法与标准 Python (CPython) 解释器的 C 编写的扩展进行接口。

几年前,曾努力使 NumPy 和 SciPy 与 .NET 兼容。当时的一些用户报告说,在 32 位 Windows 上使用 Ironclad 成功使用了 NumPy。最后,Pyjion 是一个据称可以与 SciPy 一起使用的新项目。

无论如何,这些运行时/编译器超出了 SciPy 的范围,并且不受开发团队的官方支持。

在哪里获得帮助#

请参阅社区页面。

在此页面上