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]]

