NumPy 中文教程

第一部分:基础认知与环境准备
第 1 章 全面认识 NumPy
第 2 章 开发环境搭建与验证
第二部分:核心对象 ——ndarray 数组
第 3 章 ndarray 数组基础
第 4 章 数组的形状与维度操作
第四部分:高级应用与数据处理
第 8 章 数组的排序、查找与去重
第 9 章 缺失值与异常值处理
第 10 章 随机数生成与抽样
第 11 章 文件读写与数据交互
第五部分:实战场景与落地应用
第 12 章 数值计算实战
第 13 章 数据分析实战
第六部分:优化进阶与问题解决
第 14 章 NumPy 性能优化
第 15 章 NumPy 进阶扩展
第 16 章 常见问题与解决方案

7.1 矩阵基础操作

NumPy矩阵操作完全指南:创建、属性、求逆与行列式详解

NumPy 中文教程

本教程详细讲解NumPy中矩阵的基础操作,包括使用np.matrix()和np.asmatrix()创建矩阵、矩阵属性(如转置T、共轭转置H、数组转换A)、矩阵求逆与伪逆(np.linalg.inv()和pinv())、以及矩阵的迹与行列式计算。适合新手和进阶用户学习NumPy矩阵处理。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

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官方文档或在线社区。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包