Python中很多比较成熟的科学计算库,例如用于简单数据操作的numpy,以及基于numpy更为强大的scipy,符号计算库sympy等等,一部分库是由NUMFOCUS组织所维护(https://numfocus.org)。下面我将对这些库做一些简短说明,以后会有逐个较为详细的说明。

numpy (http://www.numpy.org)

numpy应该是python中最出名的数据处理库了,他的底层调用的是intel的mkl库,从而计算速度相当的快。这里要注意的一点是用纯Python写的脚本一般而言执行起来会很慢,由于Python是胶水语言,从而一些计算密集型的操作最好是用更底层的语言C/Fortran去实现,然后通过Python来调用。numpy主要常用于对数组进行操作,很多功能类似于MATLAB中的数组,专门用来处理数据的语言一般都会支持对数组进行整体操作,而不用循环进行操作,这样可以使得敲代码的时候更像是在敲公式,而不过多的关心非数学的东西。
numpy中的基础数据类型是ndarray(可用于isinstance的判断),通过调用array来实现,例如定义一个一维数组A。
一般习惯将numpy简写为np

1
2
3
4
import numpy as np 
A = np.array([1, 2, 3]) # 三元素的一位数组
B = np.sqrt(A) # 对A中的元素逐个开方并赋值给B
C = A.copy() # A的拷贝,一定不能C = A去赋值

上述创建了一个一位数组A,并进行了简单的开方运算,需要注意的是复制array的时候一定不能用等号=去完成,这里类似于list,用等号仅仅是传递了数组的头指针,而不是一份拷贝,这就意味着复制后的数组中元素的更改会引起原数组的更改,从而引起奇怪的错误。

另外现在有了基于GPU和numpy中API相同的工具包,例如基于CUDA的cupy和基于OpenCL的clpy。

scipy (https://www.scipy.org)

scipy是基于numpy开发的,其中加强了一些numpy中没有的功能,例如数值积分、数据拟合等等,scipy习惯上简写为sp。scipy中的功能被分为很多子模块(部分):

scipy.special # 特殊函数
scipy.integrate # 数值积分
scipy.optimize # 数值拟合
scipy.interpolate # 数据插值
scipy.signal # 信号处理
scipy.stats # 数理统计
scipy.fftpack # 傅立叶分析
scipy.linalg # 线性代数

例如最常用的数值积分是scipy.integrate.quad,和老版本的MATLAB中的函数是同一个名字,其中stats中提供了很多可供抽样的函数(正态分布等),可以很方面的进行抽样和拟合。类似的多元线性分析库有statsmodels,最终结果会以一个表格的形式给出,其中主要分为有权重的最小二乘法模型(WLS)、无权重的最小二乘法模型(OLS)和广义的最小二乘法模型(GLS)。

pandas (http://pandas.pydata.org)

pandas似乎在数据处理中是最出名的一个(习惯简写为pd),其中的基本数据类型是一种被称作数据框的东西DataFrame,类似于对表格的处理,数据量较小时可以才用Excel进行分析,但是当数据过大甚至超过Excel最大支持的行数和列数时则只能才用其他方式去处理数据,pandas就是一种解决方案。pandas支持很多数据接口,csv、xls、txt等,还有现在大数据主流的数据储存格式hdf5等。pandas中对数据框的操作就是对表格中列和行的操作,和直接手动在表格中点是一样的,其中的apply成员函数可以很方便的编写对数据框元素的操作,这要比直接用Python中的循环要快很多。

numba (http://numba.pydata.org)

这个库是用于加速运算的,是通过一种称之为成为即时编译(just in time)的技术来实现循环加速的,原理就是将要多次循环的语句体进行编译,之后再次调用则直接上使用编译好的语句体。第一次运行编译时间会相对久一些,但是当循环很多的时候,运行速度会有质的飞跃。多数情况下利用的就是numba中的jit修饰器(@)进行即时编译的,修饰一些完全由循环组成的函数。

另外为了提升Python的运行速度,可以通过某些手段对Python脚本进行编译后再进行运行,例如PyPy(http://pypy.org),缺点是他不能覆盖所有的库。

sklearn (https://scikit-learn.org/stable)

2000年后由于计算机计算能力的提高,对于机器学习以及其中更为高深的深度学习变得异常的火,Python中对出名的机器学习库就是sklearn了,其中提供了一套极为相似的API,从而很方面的去使用。另外还有Google开源的深度学习库Tensorflow。

sympy (https://www.sympy.org/en/index.html)

sympy是Python中的符号处理库,但是现在性能还是不太好,支持的特殊函数也比较有限。

另外粒子物理与原子核物理中经常使用的CERN开发的ROOT工具包中已经有了Python、R和JS的接口,root_pandas和root_numpy。