7.1 矩阵基础操作
NumPy矩阵操作完全指南:创建、属性、求逆与行列式详解
本教程详细讲解NumPy中矩阵的基础操作,包括使用np.matrix()和np.asmatrix()创建矩阵、矩阵属性(如转置T、共轭转置H、数组转换A)、矩阵求逆与伪逆(np.linalg.inv()和pinv())、以及矩阵的迹与行列式计算。适合新手和进阶用户学习NumPy矩阵处理。
NumPy矩阵操作完全教程
引言
NumPy是Python中用于科学计算的核心库,尤其在矩阵和线性代数操作中扮演着重要角色。本教程将带您从零开始学习NumPy中的矩阵基础操作,适合初学者和有一定Python基础的用户。通过详细解释和代码示例,您将掌握创建矩阵、处理矩阵属性、进行矩阵运算等关键技能。
1. 矩阵基础操作
在NumPy中,矩阵是二维数组,但NumPy提供了专门的矩阵类(np.matrix)来简化线性代数操作。不过,标准数组(np.ndarray)也支持大多数矩阵操作,因此了解两者之间的区别很重要。矩阵基础操作包括加法、减法、乘法等,但本教程将专注于更高级的功能。
关键点:NumPy矩阵继承自数组,但重载了一些操作符(如*表示矩阵乘法,而数组使用@或np.dot())。
2. 矩阵创建
NumPy提供了两种主要方法来创建矩阵:np.matrix() 和 np.asmatrix()。
np.matrix()
- 创建一个新的矩阵对象。它接受多种输入形式,如列表、数组或字符串(表示矩阵元素)。
- 语法:
np.matrix(data, dtype=None, copy=True)data:输入数据,可以是列表、数组或其他序列。dtype:可选,指定数据类型。copy:布尔值,默认为True,表示复制数据。
- 示例代码:
import numpy as np
# 使用列表创建矩阵
mat1 = np.matrix([[1, 2], [3, 4]])
print("矩阵 mat1:")
print(mat1)
# 使用字符串创建(不常用,但支持)
mat2 = np.matrix('1 2; 3 4') # 分号分隔行
print("矩阵 mat2:")
print(mat2)
np.asmatrix()
- 将输入转换为矩阵,如果输入已经是矩阵,则直接返回;否则尝试转换为矩阵。
- 语法:
np.asmatrix(data) - 示例代码:
arr = np.array([[5, 6], [7, 8]])
mat3 = np.asmatrix(arr)
print("通过数组转换的矩阵 mat3:")
print(mat3)
print("类型:", type(mat3))
注意:np.matrix()会创建新矩阵,而np.asmatrix()是视图操作,可能共享数据(如果输入是数组且copy参数为False时)。
3. 矩阵属性(T/H/A)与数组转换
矩阵对象有几个常用属性,用于获取转置、共轭转置等。
矩阵属性
- T:返回矩阵的转置(transpose)。对于实数矩阵,这是行和列互换;对于复数矩阵,转置不涉及共轭。
- H:返回矩阵的共轭转置(Hermitian transpose),仅适用于复数矩阵;对于实数矩阵,与T相同。
- A:返回矩阵作为基础数组(
np.ndarray),这是一个视图,不复制数据。 - 示例代码:
mat = np.matrix([[1, 2j], [3, 4]]) # 包含复数
print("原始矩阵 mat:")
print(mat)
print("转置 mat.T:")
print(mat.T) # 转置
print("共轭转置 mat.H:")
print(mat.H) # 共轭转置(共轭复数)
print("作为数组 mat.A:")
print(mat.A) # 数组视图
print("数组类型:", type(mat.A))
数组转换
- 除了使用
.A属性,还可以使用np.array()将矩阵转换为数组。 - 示例代码:
mat_array = np.array(mat) # 转换为数组
print("转换后的数组:")
print(mat_array)
print("类型:", type(mat_array))
注意:转换为数组后,*操作符将执行元素级乘法,而不是矩阵乘法。
4. 矩阵求逆(np.linalg.inv())与伪逆(np.linalg.pinv())
矩阵的逆在解线性方程组中非常重要。NumPy提供了函数来计算逆和伪逆。
np.linalg.inv()
- 计算方阵的逆矩阵。输入必须是方阵(行数和列数相等)且可逆(行列式不为零)。
- 语法:
np.linalg.inv(a)a:输入矩阵。
- 示例代码:
mat = np.matrix([[4, 7], [2, 6]])
print("原始矩阵 mat:")
print(mat)
inverse_mat = np.linalg.inv(mat)
print("逆矩阵:")
print(inverse_mat)
# 验证:mat * inverse_mat 应接近单位矩阵
test = mat * inverse_mat
print("验证(应接近单位矩阵):")
print(test)
np.linalg.pinv()
- 计算矩阵的伪逆(Moore-Penrose伪逆),适用于非方阵或奇异矩阵(行列式为零)。
- 语法:
np.linalg.pinv(a, rcond=None)a:输入矩阵。rcond:可选,奇异值截断阈值。
- 示例代码:
mat_non_square = np.matrix([[1, 2, 3], [4, 5, 6]]) # 2x3 非方阵
print("非方阵 mat_non_square:")
print(mat_non_square)
pseudo_inv = np.linalg.pinv(mat_non_square)
print("伪逆矩阵:")
print(pseudo_inv)
注意:求逆时可能遇到数值不稳定性或奇异矩阵错误;伪逆提供了一种更稳健的解决方案。
5. 矩阵的迹(np.trace())与行列式(np.linalg.det())
迹和行列式是矩阵的重要数值特征。
np.trace()
- 计算矩阵的迹,即主对角线元素之和。
- 语法:
np.trace(a, offset=0, axis1=0, axis2=1)a:输入矩阵或数组。offset:可选,偏移量,用于计算非主对角线的迹。
- 示例代码:
mat = np.matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("矩阵 mat:")
print(mat)
trace_value = np.trace(mat)
print("迹:", trace_value) # 输出:1+5+9=15
np.linalg.det()
- 计算矩阵的行列式,仅适用于方阵。行列式为零表示矩阵奇异(不可逆)。
- 语法:
np.linalg.det(a)a:输入矩阵。
- 示例代码:
det_value = np.linalg.det(mat)
print("行列式:", det_value) # 对于上例,计算3x3矩阵的行列式
# 示例2
mat_singular = np.matrix([[1, 2], [2, 4]]) # 行列式为零
print("奇异矩阵:")
print(mat_singular)
det_singular = np.linalg.det(mat_singular)
print("行列式:", det_singular) # 应接近零
注意:行列式计算可能受数值精度影响,小值可能被视为零。
结论
通过本教程,您学习了NumPy中矩阵的基础操作,包括使用np.matrix()和np.asmatrix()创建矩阵、利用属性(T、H、A)处理转置和数组转换、计算矩阵逆和伪逆、以及求迹和行列式。NumPy的矩阵功能强大,适用于各种科学计算场景。继续练习,您将能熟练应用于线性代数、机器学习和数据分析中。
如果您有任何问题,欢迎查阅NumPy官方文档或在线社区。