本文是 Python 机器学习基础系列文章的第二篇——Numpy 篇。剩余部分可在如下链接找到:
[1] Python 机器学习基础(一)——Python 篇
[2] Python 机器学习基础(二)——Numpy 篇
Numpy
Numpy 是 Python 的一种开源数值计算扩展包,它可以用于存储和处理大型矩阵,比 Python 自带的嵌套列表结构要高效得多。
Numpy 数组(Numpy array)
数组(array)是 numpy 模块的一个主要类,可以表示向量(一维)、矩阵(二维)或高维数组,如声音、图像、视频等,并可以进行面向向量或矩阵的运算。
创建 array
用 array 构造函数创建一个 numpy 数组,可以是 1-D, 2-D, 3-D,…:
|
|
其中 array() 函数的输入是一个 list 结构。
可以调用函数创建一些特殊的 array:
|
|
总结:创建 array 时,数据用 list 指定,维度用 tuple 指定。
基本数据类型
Numpy 中的基本数据类型包括:bool, int8~int64/int, uint8~uint64/uint, float16~float64/float, complex64, complex128/complex, S7(字符串)等。使用 a.dtype
可以查看数组的元素数据类型,在创建数组时指定 dtype
关键字可以指定数据类型。
|
|
np.array
创建的数组默认类型是 int64
,其他函数创建的 array 默认是 float
类型。可以使用 astype()
方法转换类型,如 b = a.astype('float')
。
索引和切片
array 的索引和切片与 Python 的序列容器(list, tuple 等)几乎完全一致,同样使用索引符 []
来索引,从 0 开始索引,冒号符 a[start:end:step]
来切片,a[::-1]
可以翻转一个一维数组。
|
|
对于多维数组,可以使用逗号分隔的多个索引来取值:
|
|
需要注意的是,与 Python 序列容器不同,array 上的索引和切片只是原数据的一个视图(view)或引用,而非拷贝。因此对索引或切片的任何更改都会反映到原始数据上。如果需要复制,用 array 的 copy 方法。此外,可以用 np.may_share_memory
函数检查两个变量是否共享内存。
|
|
用数组索引
Numpy arrays 可以用数字或 slice 索引,但也可以使用布尔(boolean)或整数(integer)数组来索引(作为 mask)。这类索引叫 fancy indexing。
|
|
Array 上的数值运算
点对点运算
Array 上所有的算术运算均为点对点(elementwise)运算。如下实例:
|
|
要想执行矩阵乘法,用 dot()
方法:
|
|
数组比较运算等:
|
|
此外,np.allclose(a, b) 用于逐元素判断数组 a, b 的值是否足够接近(小于指定 tolerance)。
数组统计运算
包括求和、最大最小值、中值、平均值、标准差等。
|
|
数值运算的传播
上面讲的点对点运算只针对等维度的数组。但是,我们同样可以在维度不等的数组之间进行数值运算,Numpy 会自动将它们转换为维度相等的数组。这个过程叫做数值运算的传播(broadcasting)。
|
|
array 传播的规则是,把低维数组通过复制转化为与高维数组同维度,再进行两两运算。如下图所示:
为数组增加一个维度:
|
|
数组变形
拉成向量(ravel 函数)与 reshape:
|
|
高维数据会先将最后一个维度拉平。增加一个维度:
|
|
维度重新排序(transpose 函数):
|
|
resize 与 reshape 不一样,resize 可以更改维度,并在缺省的地方补 0:
|
|
但是,当数据被其他变量名引用时是不能 resize 的:
|
|
数组相关函数
排序:
|
|