前段时间写了两个系列文章,分别介绍了Python
中的两个重要的科学计算的库Numpy
和Scipy
。
从系列的文章中,可以看出,它们都提供了强大的数值计算功能,而且很多地方看着似乎是重复的。
其实这两个库虽然密切相关,但它们各自侧重的领域是不同的。
本篇我根据自己的使用体验,对两个库进行简单的对比分析。
1. Numpy的侧重点
首先是Numpy
库,我认为它是Python
中最基础的数值计算库,它是很多知名的科学计算库的基础(包括Scipy
,其实也是基于Numpy
的)。
这个库的名称Numpy
分两部分,前半部分Num
就是numerical
的缩写,表示它专注于数值处理;py
则是Python
的缩写。
Numpy
最强大的地方在于它的多维数组对象(ndarray
),不仅可以存储和处理大规模的数据,而且在进行数学运算时具有很高的性能。
使用Numpy
进行数值计算,绝对能改变你对Python运行性能差的固有印象。
这是因为Numpy
并没有直接使用Python
语言原生的列表 ,元组 等数据结构来实现它的多维数组。
而是借鉴了C/C++
的方式,不仅让数组中的元素类型保持一致,存储上也是放在连续的内存块中,所以计算时的性能有飞跃提升。
除了在底层上提供了一个高效的数据结构(ndarray
),还基于次结构提供了一系列数学函数,可以像操作单个数值一样进行各类数学运算,也包括复杂的矩阵计算。
总之,Numpy
侧重于为我们提供一套高效的计算工具箱,只要把我们需要计算的数据映射到Numpy
的ndarry
数组,就可以高效的完成各种数学计算。
但是,Numpy
本身并不与某个具体的科学领域先关联。
2. Scipy的侧重点
相比于Numpy
,SciPy
更加注重科学和工程领域的应用。
从这个库的名称SciPy
也可以看出,前半部分Sci
就是scientific
的缩写,表示它是用于科学领域的;py
则是Python
的缩写。
SciPy
是基于Numpy
的,它利用了NumPy
中高效的多维数组结构(即ndarray
)和基于此结构的各种计算函数。
只不过,SciPy
是按照不同的科学和工程领域,封装了不同的数学函数和算法,比如系列文章中介绍的求解线性方程组、最优化问题、信号处理等12个不同的子模块。
用个可能不太恰当的比喻来说的话,比如Numpy
是塑料 ,
如果我们把塑料做成一次性的杯子和碗的话,那就可用于餐饮行业 ;
如果我们把塑料做成风扇和空调外壳的话,那就可用于家电行业 ;
如果我们把塑料做成儿童玩具的话,那就可用于儿童消费品行业 ;
。。。。。。
将塑料 (Numpy
)封装成各个行业直接可用的部件 ,就是Scipy
的主要功能。
Scipy
针对不同的领域封装了不同的子模块,每个子模块中有对应领域最常用的函数。
3. 两者的选择
对于NumPy
和SciPy
,两者是相互依赖的,我们并不需要做出究竟选择哪一个更好的决定。
其实在大部分实际情况下,都是结合使用这两个库的。
一般都是先用Numpy
来处理数据,数据处理好之后,再用Scipy
中针对各个科学领域封装好的函数直接运算出结果。
例如,在数据分析 时,先利用NumPy
提供的高效数据处理和数学计算功能处理数据,再用SciPy
提供的更高级的科学计算工具来进行分析。
在机器学习 时,先利用NumPy
提供矩阵运算和线性代数功能处理数据,再用SciPy
提供的更高级的优化算法和信号处理功能进行模型训练和调优。
总的来说,NumPy
和SciPy
都是Python
中重要的科学计算库,它们各自侧重的领域有所不同。
NumPy
专注于提供高性能的数组操作和数学函数(底层 ),
而SciPy
则更加注重科学和工程领域的应用(上层)。
在实际使用中,这两个库通常需要一起使用,以便充分利用它们各自的强大功能。