SciPy 是一套开源(BSD 许可)的 Python 科学和数值工具。它目前支持特殊函数、积分、常微分方程(ODE)求解器、梯度优化、并行编程工具、一个用于快速执行的表达式到 C++ 编译器等。一个好的经验法则是,如果某个功能在数值计算的通用教科书(例如,著名的 Numerical Recipes 系列)中有所涵盖,那么它很可能已经在 SciPy 中实现了。
SciPy 是免费提供的。它作为开源软件分发,这意味着您可以完全访问源代码,并可以在其宽松的 BSD 许可允许的任何方式下使用它。
根据 BSD 许可的条款,SciPy 的许可对商业和非商业用途均免费,详见此处。
实际上,时间关键的循环通常用 C、C++ 或 Fortran 实现。SciPy 的部分内容是基于 https://www.netlib.org/ 免费提供的科学例程的薄层代码。Netlib 是一个巨大的存储库,里面包含了用 C 和 Fortran 编写的极其有价值且健壮的科学算法。重写这些算法并调试它们将是愚蠢且耗时多年的。SciPy 使用各种方法为这些算法生成“包装器”,以便它们可以在 Python 中使用。一些包装器是手工用 C 编写的。其余的则是使用 SWIG 或 f2py 生成的。SciPy 的一些新贡献要么完全用 Cython 或 Pythran 编写,要么用它们进行包装。
第二个答案是,对于困难的问题,一个更好的算法可以在解决问题所需的时间上产生巨大的差异。因此,使用 SciPy 的内置算法可能比用 C 编写的简单算法快得多。
SciPy 开发团队努力使 SciPy 尽可能可靠,但与任何软件产品一样,错误确实会发生。如果您发现影响您软件的错误,请通过在 SciPy 错误跟踪器中提交工单告知我们。
请前往我们的社区页面。我们非常希望更多人能帮助编写代码、测试、文档,并协助网站维护。
是的,多家公司为 SciPy 提供商业支持,例如 Anaconda、Enthought 和 Quansight。
在一个理想的世界中,NumPy 将只包含数组数据类型和最基本的操作:索引、排序、重塑、基本的逐元素函数等。所有数值代码都将驻留在 SciPy 中。然而,NumPy 的一个重要目标是兼容性,因此 NumPy 试图保留其任何一个前身支持的所有功能。因此,NumPy 包含一些线性代数函数和傅里叶变换,尽管这些更适合属于 SciPy。无论如何,SciPy 包含功能更完善的线性代数模块,以及许多其他数值算法。如果您正在使用 Python 进行科学计算,您应该同时安装 NumPy 和 SciPy。大多数新功能属于 SciPy 而非 NumPy。
绘图功能超出了 SciPy 的范围,SciPy 专注于数值对象和算法。有几个包与 SciPy 紧密集成以生成高质量的图表,例如非常流行的 Matplotlib。其他流行的选择是 Bokeh、Plotly 和 Altair。
与 2D 绘图类似,3D 图形超出了 SciPy 的范围,但就像 2D 情况一样,存在与 SciPy 集成的软件包。Matplotlib 在 mplot3d
子包中提供了基本的 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 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 中引入的。
总的来说,是的。PyPy 最近的改进使得科学 Python 栈能够与 PyPy 一起工作。由于 SciPy 的大部分是作为 C 扩展模块实现的,因此代码可能不会运行得更快(在大多数情况下仍然明显更慢,但 PyPy 正在积极改进这一点)。一如既往地进行基准测试时,您的经验是最好的指导。
不能,两者都不支持。Jython 从未工作过,因为它运行在 Java 虚拟机之上,无法与为标准 Python (CPython) 解释器编写的 C 扩展进行接口。
几年前,曾有人努力使 NumPy 和 SciPy 与 .NET 兼容。当时一些用户报告在 32 位 Windows 上使用 Ironclad 成功使用了 NumPy。最后,Pyjion 是一个据称可以与 SciPy 一起工作的新项目。
无论如何,这些运行时/编译器超出了 SciPy 的范围,并且不受开发团队的官方支持。
请参阅社区页面。