常见问题

什么是 SciPy?#

SciPy 是一套开源(BSD 许可)的 Python 科学和数值工具。它目前支持特殊函数、积分、常微分方程(ODE)求解器、梯度优化、并行编程工具、一个用于快速执行的表达式到 C++ 编译器等。一个好的经验法则是,如果某个功能在数值计算的通用教科书(例如,著名的 Numerical Recipes 系列)中有所涵盖,那么它很可能已经在 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 与 SciPy 与其他软件包#

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.linalgscipy.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。支持 Python 2.7 的最后一个 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 的范围,并且不受开发团队的官方支持。

在哪里获得帮助#

请参阅社区页面。

在本页面上