13  NumPy 矩阵入门教学

13.1 什么是矩阵?

矩阵是一个按照长方形阵列排列的数字集合。它由行(横向)和列(纵向)组成。例如,一个 2×3 的矩阵表示这个矩阵有 2 行 3 列。

矩阵的表示方式:

\[ \begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \end{bmatrix} \]

其中,\(a_{ij}\) 表示第 i 行第 j 列的元素。

13.2 NumPy 中的矩阵操作

13.2.1 创建矩阵

在 NumPy 中,我们可以使用 array 函数来创建矩阵:

import numpy as np

# 创建一个简单的 2x3 矩阵
matrix_A = np.array([[1, 2, 3],
                     [4, 5, 6]])

print("矩阵 A:")
print(matrix_A)

# 查看矩阵的形状(行数和列数)
print("\n矩阵的形状:")
print(matrix_A.shape)
矩阵 A:
[[1 2 3]
 [4 5 6]]

矩阵的形状:
(2, 3)

13.2.2 基本矩阵运算

矩阵的基本运算包括加法、减法和乘法。让我们通过例子来理解:

# 创建两个 2x2 矩阵
A = np.array([[1, 2],
              [3, 4]])

B = np.array([[5, 6],
              [7, 8]])

print("矩阵 A:")
print(A)
print("\n矩阵 B:")
print(B)

# 矩阵加法:对应位置的元素相加
print("\n矩阵加法 A + B:")
print(A + B)

# 矩阵减法:对应位置的元素相减
print("\n矩阵减法 A - B:")
print(A - B)

# 矩阵乘法:使用 np.dot 或 @
print("\n矩阵乘法 A × B:")
print(np.dot(A, B))
矩阵 A:
[[1 2]
 [3 4]]

矩阵 B:
[[5 6]
 [7 8]]

矩阵加法 A + B:
[[ 6  8]
 [10 12]]

矩阵减法 A - B:
[[-4 -4]
 [-4 -4]]

矩阵乘法 A × B:
[[19 22]
 [43 50]]

13.3 矩阵运算规则说明

13.3.1 矩阵加减法

  • 只有相同大小的矩阵才能进行加减运算
  • 加减法是对应位置的元素进行运算
  • 结果矩阵的大小与原矩阵相同

13.3.2 矩阵乘法

  • 矩阵 A 的列数必须等于矩阵 B 的行数
  • 结果矩阵的行数等于 A 的行数,列数等于 B 的列数
  • 计算方式:\[(AB)_{ij} = \sum_k a_{ik}b_{kj}\]

例如,对于 2×2 矩阵相乘: \[ \begin{bmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{bmatrix} \times \begin{bmatrix} b_{11} & b_{12} \\ b_{21} & b_{22} \end{bmatrix} = \begin{bmatrix} a_{11}b_{11}+a_{12}b_{21} & a_{11}b_{12}+a_{12}b_{22} \\ a_{21}b_{11}+a_{22}b_{21} & a_{21}b_{12}+a_{22}b_{22} \end{bmatrix} \]

13.4 矩阵的特殊类型

  1. 方阵:行数和列数相等的矩阵
  2. 单位矩阵:主对角线上的元素为1,其他位置为0的方阵
  3. 对角矩阵:除主对角线外的元素都为0的方阵
  4. 零矩阵:所有元素都是0的矩阵
# 创建单位矩阵
I = np.eye(2)
print("2×2 单位矩阵:")
print(I)

# 创建零矩阵
Z = np.zeros((2, 3))
print("\n2×3 零矩阵:")
print(Z)
2×2 单位矩阵:
[[1. 0.]
 [0. 1.]]

2×3 零矩阵:
[[0. 0. 0.]
 [0. 0. 0.]]

13.5 练习建议

  1. 尝试创建不同大小的矩阵
  2. 验证矩阵加法的交换律:A + B = B + A
  3. 验证矩阵乘法不满足交换律:A × B ≠ B × A
  4. 尝试创建一个对角矩阵并进行运算

13.6 矩阵的高级操作

13.6.1 矩阵形状变换(reshape)

在NumPy中,我们可以使用reshape函数来改变矩阵的形状,只要保证元素总数不变:

# 创建一个1维数组
array_1d = np.array([1, 2, 3, 4, 5, 6])
print("原始数组:")
print(array_1d)

# 将1维数组重塑为2x3矩阵
matrix_2x3 = array_1d.reshape(2, 3)
print("\n重塑为2x3矩阵:")
print(matrix_2x3)

# 将2x3矩阵重塑为3x2矩阵
matrix_3x2 = matrix_2x3.reshape(3, 2)
print("\n重塑为3x2矩阵:")
print(matrix_3x2)
原始数组:
[1 2 3 4 5 6]

重塑为2x3矩阵:
[[1 2 3]
 [4 5 6]]

重塑为3x2矩阵:
[[1 2]
 [3 4]
 [5 6]]

13.6.2 对角矩阵操作(diag)

NumPy的diag函数有两个主要用途: 1. 从一维数组创建对角矩阵 2. 提取矩阵的对角线元素

# 从一维数组创建对角矩阵
diagonal_elements = np.array([1, 2, 3])
diagonal_matrix = np.diag(diagonal_elements)
print("从数组创建的对角矩阵:")
print(diagonal_matrix)

# 从矩阵中提取对角线元素
matrix = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])
diagonal = np.diag(matrix)
print("\n矩阵的对角线元素:")
print(diagonal)
从数组创建的对角矩阵:
[[1 0 0]
 [0 2 0]
 [0 0 3]]

矩阵的对角线元素:
[1 5 9]

13.6.3 矩阵元素乘积(prod)

prod函数用于计算数组或矩阵中元素的乘积:

# 创建一个2x3矩阵
matrix = np.array([[1, 2, 3],
                   [4, 5, 6]])
print("原始矩阵:")
print(matrix)

# 计算所有元素的乘积
total_prod = np.prod(matrix)
print("\n所有元素的乘积:")
print(total_prod)

# 按行计算乘积(axis=1)
row_prod = np.prod(matrix, axis=1)
print("\n每行元素的乘积:")
print(row_prod)

# 按列计算乘积(axis=0)
col_prod = np.prod(matrix, axis=0)
print("\n每列元素的乘积:")
print(col_prod)
原始矩阵:
[[1 2 3]
 [4 5 6]]

所有元素的乘积:
720

每行元素的乘积:
[  6 120]

每列元素的乘积:
[ 4 10 18]

这些高级操作在数据处理和科学计算中非常有用:

  • reshape常用于调整数据的维度,特别是在机器学习中准备输入数据时
  • diag在线性代数计算中经常使用,例如计算特征值和特征向量
  • prod在统计分析中用于计算几何平均数或累积回报率