Python机器学习库笔记(1)——numpy
numpy是Python的一个线性代数库,其核心是提供了ndarray
这一数据类型代替了原生的list
,可以进行高效的并行计算,是几乎所有机器学习包的依赖库。
1 | import numpy as np |
数组的基本操作
ndarray
可以用于表示多维数组,与list
不同的是,ndarray
中的数据全是同一类型,这样大大提高了计算效率。
1 | # 创建数组对象并赋值 |
数据类型
ndarray
默认的数据类型是np.float64
,即双精度。在大多数时候可以通过dtype
参数来指定数组的数据类型。
1 | # 查看数组的数据类型 |
生成数组
numpy提供多种方式快速构造数组。
1 | # 返回一个以0为起点,n为终点,步长为1的一维数组 |
随机数
numpy.random提供多种方式生成随机数组。
1 | # 设置随机数种子,以便复现结果 |
数组运算
在实际应用中,二维数组(即矩阵)的运算最为多见,因此以二维数组运算举例。
1 | a = np.array([[1,2,3],[4,5,6],[7,8,9]]) |
1 | # 数组相加 |
$$\begin{bmatrix} 1&2&3\4&5&6\7&8&9 \end{bmatrix} \cdot \begin{bmatrix} 9&8&7\6&5&4\3&2&1 \end{bmatrix}=\begin{bmatrix} 9&16&21\24&25&24\21&16&9 \end{bmatrix}$$
1 | # 矩阵乘法(即叉乘,要求左矩阵的列数等于右矩阵的行数) |
$$\begin{bmatrix} 1&2&3\4&5&6\7&8&9 \end{bmatrix} \times \begin{bmatrix} 9&8&7\6&5&4\3&2&1 \end{bmatrix}=\begin{bmatrix} 30&24&18\84&69&54\138&114&90 \end{bmatrix}$$
1 | # 过滤数组,返回布尔型的数组 |
广播
numpy中的广播机制允许满足条件的两个shape不同的数组进行加、减、乘运算。
- 若两个数组的维数不同,则在不足的数组的shape前补1。例如shape分别为(n,m)和(k,)的数组相加,则后者补为(1,k)。
- 两个数组的各个维度的长度要么相等,要么其中一个为1,则可进行运算,否则报错。
- 对长度为1的维度,复制这一行/列元素并使得shape与另一个数组相同,然后进行普通的运算。
1 | np.array([[1,2,3],[4,5,6]])+3 |
例如,([[1,2,3],[4,5,6]])与一个数3相加。3先被填充为shape(1,1),再复制自身到所有行、列使自身shape等于(2,3),即([[3,3,3],[3,3,3]]),那么就相当于([[1,2,3],[4,5,6]])与([[3,3,3],[3,3,3]])相加,结果为([[4,5,6],[7,8,9]])。
$$\begin{bmatrix} 1&2&3\4&5&6 \end{bmatrix}+3=\begin{bmatrix} 1&2&3\4&5&6 \end{bmatrix}+\begin{bmatrix} 3&3&3\3&3&3 \end{bmatrix}=\begin{bmatrix} 4&5&6\7&8&9 \end{bmatrix}$$
1 | np.array([[1],[2],[3]])+np.array([4,5,6]) |
同理,([[1],[2],[3]])和([4,5,6])相加,相当于([[1,1,1],[2,2,2],[3,3,3]])和([[4,5,6],[4,5,6],[4,5,6]])相加。
$$\begin{bmatrix} 1\2\3 \end{bmatrix}+\begin{bmatrix} 4&5&6 \end{bmatrix}=\begin{bmatrix} 1&1&1\2&2&2\3&3&3 \end{bmatrix}+\begin{bmatrix} 4&5&6\4&5&6\4&5&6 \end{bmatrix}=\begin{bmatrix} 5&6&7\6&7&8\7&8&9 \end{bmatrix}$$