NumPy. URL: https://numpy.org/
SciPy. URL: https://www.scipy.org/
首先来一拨正名。所谓“SciPy”其实是个组织,负责一系列 Python 包的更新和维护。同时“SciPy”也指一个 Python 包。所谓“NumPy”则只是一个 Python 包。不论 NumPy 这个包还是 SciPy 这个包都由 SciPy 这个组织维护。
NumPy 所提供的功能是数值计算和数值线性代数。其最核心的功能就是为 Python 提供了张量这种数据结构以及张量相关的基本运算——例如数乘、矩阵乘法、张量拼接等等。而所谓的“张量”其实就是向量以及各种向量的向量。举例来说,单个的 32 位浮点数是一个标量,也称作 0 阶张量。三个 32 位浮点数一组就构成一个维度为 3 的 1阶张量,一般也叫“三维向量”。5 个三维向量 就可以组成一个“五乘三矩阵”,实际上也可以叫维度分别为 5, 3 的 2 阶张量。而这样的矩阵为元素组成的向量就是 3 阶张量,3 阶张量为元素组成的向量就是 4 阶张量。
SciPy 则是在 NumPy 的张量线性代数框架的基础上增加了常用的数值计算工具,例如科学常量、常用特殊方程、常用数值算法等等。当你新学了一个数值方法想要付诸实现的时候不要盲目自己写,先看看 NumPy, SciPy 中有没有相关的功能是一个比较明智的做法。
其实数值计算也好,张量代数也罢,都不是什么新鲜的东西。MATLAB、 C 乃至 Fortran 中都早有了同类的功能或库。NumPy 这一组工具能够火爆大致可以归结为以下几点原因:
-
抽象合理且易用。相比于 C 和 Fortran, NumPy 更为易用。其张量索引方式差不多成了某种标准。相比于 MATLAB, NumPy 则修正了一些错误。例如 MATLAB 中向量还要分行列,这严格来说是错误的,因为行向量和列向量是矩阵中的概念而非向量本身的概念。
-
开源且可扩展。这有助于培养软件生态。
-
免费。免费的总是有优势。
但是应当注意到,目前 Python+NumPy 的联合仍有很多不足的地方。例如,NumPy 的张量数据结构不是 Python 标准,也还远不是所有 Python 包的默认选项。所以很多包会有自己的矩阵或者张量数据结构。这造成多个包协同使用的时候要做大量繁琐的类型转换。还有 NumPy 的张量结构和 Python 本身的线性结构以及迭代器的融合并不好,一些如遍历工具之类的本来可以通用的工具目前是没法通用的。
求点赞,求收藏,求分享