NumPy是Numerical Python的简称,是Python的支持矢量运算的面向N维数组的一个运算库,目前在机器学习和数据科学领域被广泛使用,并且当前许多支持科学计算的工具包都是基于NumPy开发的,例如pandas,,scikit-learn,TensorFlow等。
NumPy最大的特点是其对象ndarray,其存储形式是N维的数组,我们可以将NumPy的1维数据看成是向量,多维数据看成是矩阵,可以把NumPy的计算看成是向量或矩阵运算,这点跟MATLAB特别相似。
说到数组,或许你可能有疑问了,Python本身就包含列表(list)和数组(array),为什么我们非要用NumPy而不用常规的Python数组呢?这主要是因为NumPy的算法库都是由C语言编写,可以直接操作内存,所以极大的提高了运行效率,一般基于NumPy的算法要比纯Python快10-100倍,并且占用的内存更少,可以说是既快又省。
基于NumPy的数据结构特点,本文主要从NumPy的一维数组(可以理解为向量)和多维数组(可以理解为矩阵)2个方面进行介绍,以便于大家系统性的学习NumPy。
一维数组(向量)
- 创建数组
最基本的方式是利用NumPy的array()函数通过列表创建数组。
在实际应用中,我们经常会用到一些已经初始化的数组,比如全0数组、全1数组、随机数组等等。NumPy也提供了相应的函数zeros()、ones()、random()等函数。
- 数组运算
NumPy对于长度相等的一维数组的运算都会将运算应用到元素级,事实上就是向量的缩放、向量的加减法,需要注意的是两个数组相乘跟点积是不一样的。
- 数组的索引和切片
NumPy对于一维数组的索引与Python中列表的索引没什么区别。
- 聚合
NumPy中ndarray是一个对象,提供了许多聚合方法用于对象的操作,例如求最大值、最小值、均值等等。
多维数组(矩阵)
- 创建矩阵
同一维数组类似,矩阵的创建既可以通过基本的列表操作实现,也可以用上面提到的初始化函数zeros()、ones()、random()等函数,只不过需要相应的增加维度。
- 矩阵运算
NumPy中矩阵的加减运算同样将
行列数相等的矩阵应用到元素级,NumPy有个很好的功能叫广播(broadcast ),既对于行列数不同的矩阵,只要有一个矩阵的行数或列数与另一个矩阵一致,并且是一个一维矩阵,那么2个矩阵在作运算时,NumPy会自动把那个一维矩阵补充成完整的多维矩阵。- 点积
NumPy提供了矩阵之间的点积运行函数dot(),可以直接计算矩阵的点积。
- 索引和切片
同样的,矩阵的索引和切片与Python中2维数组类似,第一个维度对应于行,第二个维度对应于列,取多个元素可以用“:”。
- 矩阵聚合
矩阵同样支持聚合操作,除了对所有值进行聚合,NumPy还支持对特定的轴进行聚合,axis=0(既0轴)表示对横轴进行操作,在计算上是沿着横轴方向一列一列计算;axis=1(既1轴)表示对纵轴进行操作,在计算上是沿着纵轴方向一行一行计算。
- 矩阵变换
在线性代数中常常用到举证的变换,例如矩阵转置、矩阵重塑。NumPy提供了.T属性用于矩阵的转置,reshape()函数用于矩阵的重塑。
总结
NumPy在Python线性代数的运算中提供了非常好的数据结构,其ndarray对象拥有许多方便的方法和属性,并且其良好的运算性能也是纯Python不能替代的,所以在机器学习中NumPy是非常强大的存在,学好NumPy是机器学习实现各种算法的基础。
閱讀更多 科技要述 的文章