Python机器学习库笔记(1)——numpy

numpy是Python的一个线性代数库,其核心是提供了ndarray这一数据类型代替了原生的list,可以进行高效的并行计算,是几乎所有机器学习包的依赖库。

1
import numpy as np

数组的基本操作

ndarray可以用于表示多维数组,与list不同的是,ndarray中的数据全是同一类型,这样大大提高了计算效率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 创建数组对象并赋值
a = np.array([[1,2,3],[4,5,6]])

# 将list类型转换为np.ndarray类型
a = [[1,2,3],[4,5,6]]
a = np.array(a)

# 获取数组的维数
a.ndim

# 获取指定位置的值或数组
a[0]
a[0][1]

# 获取数组各个维度的长度
a.shape

# 将数组变更为指定的维度
a.reshape(1, 6)

# 获取数组中元素的个数
a.size

# 对所有元素求和
a.sum()

# 在指定的轴方向上求和
a.sum(axis=0)

数据类型

ndarray默认的数据类型是np.float64,即双精度。在大多数时候可以通过dtype参数来指定数组的数据类型。

1
2
3
4
5
6
7
8
# 查看数组的数据类型
a.dtype

# 查看数组中每个元素占用的字节,例如int32是4字节
a.itemsize

# 更改数组的数据类型
a.astype(np.float64)

生成数组

numpy提供多种方式快速构造数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 返回一个以0为起点,n为终点,步长为1的一维数组
a = np.arange(n)

# 返回一个以m为起点,n为终点,步长为1的一维数组
a = np.arange(m, n)

# 返回一个以m为起点,n为终点,步长为k的一维数组
a = np.arange(m, n, k)

# 在[m, n]范围内等间隔取k个数字构造一维数组
a = np.linspace(m, n, k, dtype=np.int32)

# 返回一个指定维度的元素全为0的数组
a = np.zeros((2,4), dtype=np.float64)

# 返回一个指定维度的元素全为1的数组
a = np.ones((3,5))

# 返回一个指定维度的单位矩阵
a = np.eye(3, dtype=np.int32)

随机数

numpy.random提供多种方式生成随机数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 设置随机数种子,以便复现结果
np.random.seed(0)

# 从服从[0., 1.)均匀分布中随机生成指定维度的数组
a = np.random.rand(3,4)

# 从标准正态分布中随机生成指定维度的数组
a = np.random.randn(3,4)

# 从服从[n, m)均匀分布中随机生成指定维度的整数数组
a = np.random.randint(1,100,(3,4))

# 从[0., 1.)之间随机抽取一个浮点数
a = np.random.random()

数组运算

在实际应用中,二维数组(即矩阵)的运算最为多见,因此以二维数组运算举例。

1
2
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([[9,8,7],[6,5,4],[3,2,1]])
1
2
3
4
5
# 数组相加
a+b

# 数组元素对位相乘(即点乘,要求两矩阵shape相等)
a*b

$$\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
2
3
# 矩阵乘法(即叉乘,要求左矩阵的列数等于右矩阵的行数)
a.dot(b)
np.dot(a,b)

$$\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
2
3
4
5
 # 过滤数组,返回布尔型的数组
a>5

# 得到过滤后的数组
a[a>5]

广播

numpy中的广播机制允许满足条件的两个shape不同的数组进行加、减、乘运算。

  1. 若两个数组的维数不同,则在不足的数组的shape前补1。例如shape分别为(n,m)和(k,)的数组相加,则后者补为(1,k)。
  2. 两个数组的各个维度的长度要么相等,要么其中一个为1,则可进行运算,否则报错。
  3. 对长度为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}$$