NumPy - 矩阵库
NumPy 矩阵库
NumPy 矩阵库提供了用于创建和操作矩阵的函数。该库允许您执行各种矩阵运算,包括矩阵乘法、求逆和分解。
在 NumPy 中,可以使用 numpy.matrix() 函数或通过将现有数组转换为矩阵来创建矩阵。本教程将介绍创建矩阵的不同方法。
使用 numpy.matrix() 函数
numpy.matrix() 函数用于从字符串表示形式或现有数据结构创建矩阵。此函数最适合快速创建小型矩阵。
示例
在下面的示例中,我们将从字符串表示形式和现有数组创建一个矩阵。 np.matrix() 函数将字符串解释为 2x2 矩阵,并将数组直接转换为矩阵格式 -
import numpy as np # 从字符串创建矩阵 matrix_str = np.matrix('1 2; 3 4') print("Matrix from string: ", matrix_str) # 从数组创建矩阵 array_data = np.array([[1, 2], [3, 4]]) matrix_from_array = np.matrix(array_data) print("Matrix from array: ", matrix_from_array)
以下是得到的输出 -
Matrix from string: [[1 2] [3 4]] 从数组转换为矩阵: [[1 2] [3 4]]
使用 numpy.array() 函数
你可以使用 numpy.asmatrix() 函数将 NumPy 数组转换为矩阵。当您拥有数组形式的现有数据并希望对其进行矩阵运算时,这非常有用。
示例
在下面的示例中,我们创建一个数组,然后使用 np.asmatrix() 函数将其转换为矩阵 -
import numpy as np # 创建数组 array_data = np.array([[5, 6], [7, 8]]) # 将数组转换为矩阵 matrix_data = np.asmatrix(array_data) print("转换后的矩阵: ", matrix_data)
这将产生以下结果 -
转换后的矩阵: [[5 6] [7 8]]
矩阵运算NumPy
创建矩阵后,您可以执行各种矩阵运算,例如加法、乘法、转置、求逆等等。
矩阵加法
两个矩阵的加法涉及将相应的元素相加。如果两个矩阵形状相同,则可以按元素方式将它们相加。
示例
在此示例中,"matrix_1"和"matrix_2"按元素方式相加,这意味着"matrix_1"中的每个元素都会添加到"matrix_2"中的相应元素中 -
import numpy as np # 将两个矩阵相加 matrix_1 = np.array([[1, 2], [3, 4]]) matrix_2 = np.array([[5, 6], [7, 8]]) result = matrix_1 + matrix_2 print(result)
以下是上述代码的输出 -
[[ 6 8] [10 12]]
矩阵乘法
我们可以使用以下方式执行矩阵乘法 -
- 使用 * 运算符
- 使用 @ 运算符(Python 3.5+)
- 使用 np.dot() 函数
- 使用numpy.matmul() 函数
与逐元素乘法不同,矩阵乘法遵循线性代数规则。
示例
在本例中,我们使用上述所有方法对两个矩阵进行乘法运算 -
import numpy as np matrix_1 = np.array([[1, 2], [3, 4]]) matrix_2 = np.array([[5, 6], [7, 8]]) # 使用 * 进行矩阵乘法 matrix_product1 = matrix_1 * matrix_2 print("矩阵乘法 (*): ", matrix_product1) # 使用 @ 进行矩阵乘法 matrix_product2 = matrix_1 @ matrix_2 print("矩阵乘法 (@): ", matrix_product2) # 使用 np.dot() 进行矩阵乘法 matrix_product3 = np.dot(matrix_1, matrix_2) print("矩阵乘法 (np.dot()): ", matrix_product3) # 使用 np.matmul() 进行矩阵乘法 matrix_product4 = np.matmul(matrix_1, matrix_2) print("矩阵乘法 (np.matmul()): ", matrix_product4)
得到的输出如下所示 -
矩阵乘法 (*): [[ 5 12] [21 32]] 矩阵乘法 (@): [[19 22] [43 50]] 矩阵乘法 (np.dot()): [[19 22] [43 50]] 矩阵乘法 (np.matmul()): [[19 22] [43 50]]
矩阵求逆
矩阵求逆是一种运算,求出一个矩阵,当该矩阵与原矩阵相乘时,会得到单位矩阵。可以使用 np.linalg.inv() 函数计算矩阵的逆。
然而,并非所有矩阵都是可逆的。矩阵必须是方阵,并且行列式非零才能可逆。
示例
在以下示例中,我们使用 np.linalg.inv() 函数对一个 2x2 矩阵进行求逆。输出是一个新矩阵,与原矩阵相乘后得到单位矩阵 -
import numpy as np matrix = np.array([[1, 2], [3, 4]]) inverse_matrix = np.linalg.inv(matrix) print(inverse_matrix)
执行上述代码后,我们得到以下输出 -
[[-2. 1. ] [ 1.5 -0.5]]
矩阵转置
转置矩阵涉及沿对角线翻转矩阵,交换行和列的索引。我们可以使用 NumPy 中的 .T 属性转置矩阵。
示例
在下面的示例中,我们使用 ".T" 属性转置一个 2x2 矩阵 -
import numpy as np # 矩阵转置 matrix = np.array([[1, 2], [3, 4]]) transposed = matrix.T print(transposed)
结果如下 -
[[1 3] [2 4]]
矩阵行列式
矩阵的行列式是一个标量值,可以使用 np.linalg.det() 函数计算函数。它提供有关矩阵属性的信息,例如矩阵是否可逆。
非零行列式表示矩阵可逆,而行列式为零则表示矩阵为奇异矩阵。
示例
在此示例中,np.linalg.det() 函数计算给定矩阵的行列式 -
import numpy as np # 计算行列式 matrix = np.array([[1, 2], [3, 4]]) det = np.linalg.det(matrix) print("行列式:", det)
我们得到如下所示的输出 −
行列式: -2.0000000000000004
特征值和特征向量
numpy.linalg.eig() 函数用于计算方阵的特征值和右特征向量。特征值表示向量的大小,而特征向量则提供方向。
特征值和特征向量是线性代数中的基本概念,在主成分分析 (PCA) 和求解微分方程等许多领域都很重要。
示例
在此示例中,np.linalg.eig() 函数计算矩阵的特征值和特征向量。特征值表示沿每个特征向量方向的缩放幅度 -
import numpy as np # 计算特征值和特征向量 matrix = np.array([[4, -2], [1, 1]]) eigvals, eigvecs = np.linalg.eig(matrix) print("特征值:", eigvals) print("特征向量:", eigvecs)
以下是得到的输出 -
特征值:[3. 2.] 特征向量: [[0.89442719 0.70710678] [0.4472136 0.70710678]]
奇异值分解 (SVD)
SVD 是一种矩阵分解方法,它将方阵的特征分解推广到任何 m x n 矩阵。我们可以在 NumPy 中使用 numpy.linalg.svd() 函数实现这一点。
特征分解是将矩阵分解为特征值和特征向量的过程。这些特征值表示缩放因子,而特征向量则表示矩阵拉伸或压缩的方向。
示例
在下面的示例中,我们使用 np.linalg.svd() 函数对"2x2"矩阵执行奇异值分解。结果包括 U 矩阵、奇异值和 V 矩阵,它们共同表示原始矩阵 -
import numpy as np matrix_a = np.matrix('1 2; 3 4') # 执行 SVD U, S, V = np.linalg.svd(matrix_a) print("U 矩阵: ", U) print("奇异值: ", S) print("V 矩阵: ", V)
这将产生以下结果 -
U 矩阵: [[-0.40455358 -0.9145143 ] [-0.9145143 0.40455358]] 奇异值: [5.4649857 0.36596619] V 矩阵: [[-0.57604844 -0.81741556] [ 0.81741556 -0.57604844]]