NumPy - 矩阵库



NumPy 矩阵库

NumPy 矩阵库提供创建和操作矩阵的函数。此库允许您执行各种矩阵运算,包括矩阵乘法、求逆和分解。

在 NumPy 中,可以使用 numpy.matrix() 函数或通过将现有数组转换为矩阵来创建矩阵。本教程将介绍创建矩阵的不同方法。

使用 numpy.matrix() 函数

numpy.matrix() 函数用于从字符串表示或现有数据结构创建矩阵。此函数最适合快速创建小型矩阵。

示例

在下面的示例中,我们从字符串表示和现有数组创建矩阵。np.matrix() 函数将字符串解释为 2x2 矩阵,数组直接转换为矩阵格式:

import numpy as np

# Creating a matrix from a string
matrix_str = np.matrix('1 2; 3 4')
print("Matrix from string:\n", matrix_str)

# Creating a matrix from an array
array_data = np.array([[1, 2], [3, 4]])
matrix_from_array = np.matrix(array_data)
print("Matrix from array:\n", matrix_from_array)

以下是获得的输出:

Matrix from string:
[[1 2]
 [3 4]]
Matrix from array:
 [[1 2]
 [3 4]]

使用 numpy.array() 函数

您可以使用 numpy.asmatrix() 函数将 NumPy 数组转换为矩阵。当您拥有以数组形式存在的现有数据并希望对其执行矩阵运算时,这非常有用。

示例

在下面的示例中,我们创建一个数组,然后使用 np.asmatrix() 函数将其转换为矩阵:

import numpy as np

# Creating an array
array_data = np.array([[5, 6], [7, 8]])

# Converting array to matrix
matrix_data = np.asmatrix(array_data)
print("Converted Matrix:\n", matrix_data)

这将产生以下结果:

Converted Matrix:
[[5 6]
 [7 8]]

NumPy 中的矩阵运算

创建矩阵后,您可以执行各种矩阵运算,例如加法、乘法、转置、求逆等等。

矩阵加法

添加两个矩阵包括添加对应的元素。如果两个矩阵具有相同的形状,则可以逐元素地将它们相加。

示例

在此示例中,“matrix_1”和“matrix_2”逐元素相加,这意味着“matrix_1”的每个元素都加到“matrix_2”中对应的元素:

import numpy as np

# Add two matrices
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 multiplication using *
matrix_product1 = matrix_1 * matrix_2
print("Matrix Multiplication (*):\n", matrix_product1)

# Matrix multiplication using @
matrix_product2 = matrix_1 @ matrix_2
print("Matrix Multiplication (@):\n", matrix_product2)

# Matrix multiplication using np.dot()
matrix_product3 = np.dot(matrix_1, matrix_2)
print("Matrix Multiplication (np.dot()):\n", matrix_product3)

# Matrix multiplication using np.matmul()
matrix_product4 = np.matmul(matrix_1, matrix_2)
print("Matrix Multiplication (np.matmul()):\n", matrix_product4)

获得的输出如下所示:

Matrix Multiplication (*):
[[ 5 12]
 [21 32]]
Matrix Multiplication (@):
[[19 22]
 [43 50]]
Matrix Multiplication (np.dot()):
[[19 22]
 [43 50]]
Matrix Multiplication (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]]

矩阵转置

矩阵转置包括将其翻转到其对角线,交换行和列索引。我们可以使用 .T 属性在 NumPy 中转置矩阵。

示例

在下面的示例中,我们使用“.T”属性转置一个 2x2 矩阵:

import numpy as np

# Transpose of a matrix
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

# Compute the determinant
matrix = np.array([[1, 2], [3, 4]])

det = np.linalg.det(matrix)
print("Determinant:", det)

我们得到如下所示的输出:

Determinant: -2.0000000000000004

特征值和特征向量

numpy.linalg.eig() 函数用于计算方阵的特征值和右特征向量。特征值表示向量的幅度,而特征向量提供方向。

特征值和特征向量是线性代数中的基本概念,在许多领域都很重要,例如主成分分析 (PCA) 和求解微分方程。

示例

在此示例中,np.linalg.eig() 函数计算矩阵的特征值和特征向量。特征值表示沿每个特征向量方向缩放的幅度:

import numpy as np

# Compute eigenvalues and eigenvectors
matrix = np.array([[4, -2], [1,  1]])

eigvals, eigvecs = np.linalg.eig(matrix)
print("Eigenvalues:", eigvals)
print("Eigenvectors:", eigvecs)

以下是获得的输出:

Eigenvalues: [3. 2.]
Eigenvectors: 
[[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')

# Performing SVD
U, S, V = np.linalg.svd(matrix_a)
print("U Matrix:\n", U)
print("Singular Values:\n", S)
print("V Matrix:\n", V)

这将产生以下结果:

U Matrix:
[[-0.40455358 -0.9145143 ]
 [-0.9145143   0.40455358]]
Singular Values:
[5.4649857  0.36596619]
V Matrix:
[[-0.57604844 -0.81741556]
 [ 0.81741556 -0.57604844]]
广告