NumPy 矩阵库(Matrix)
在 NumPy 中,矩阵库(numpy.matrix
)是一个专门为二维矩阵设计的类,提供了与线性代数相关的便捷操作。尽管 numpy.matrix
的功能与 numpy.ndarray
(NumPy 的核心数组对象)有许多重叠,但它针对矩阵运算(如矩阵乘法、逆矩阵等)提供了更直观的接口。然而,NumPy 官方现已建议优先使用 ndarray
,因为 matrix
类的功能较为有限,且未来可能被废弃。以下是对 numpy.matrix
的详细中文讲解,涵盖其定义、用法、特点及与 ndarray
的区别。
1. 什么是 numpy.matrix
?
numpy.matrix
是 NumPy 的一个子类,专门用于表示和操作二维矩阵。它继承自 numpy.ndarray
,但针对线性代数运算进行了优化,提供了更符合数学直觉的操作方式,例如使用 *
进行矩阵乘法而非逐元素乘法。
特点:
- 始终二维:即使输入是一维数据,
matrix
也会将其转换为二维矩阵。 - 矩阵运算:
*
表示矩阵乘法,I
属性返回逆矩阵,T
返回转置,H
返回共轭转置。 - 便捷语法:为线性代数运算提供了更简洁的接口。
- 局限性:仅限于二维数组,功能不如
ndarray
灵活,且不推荐在新代码中使用。
官方建议:
NumPy 文档明确建议使用 numpy.ndarray
结合 @
运算符或 numpy.linalg
模块进行矩阵运算,因为 ndarray
支持更高维数组,且功能更通用。
2. 创建 numpy.matrix
可以通过多种方式创建 numpy.matrix
对象。
2.1 使用 np.matrix
构造函数
import numpy as np
# 从列表创建矩阵
mat = np.matrix([[1, 2], [3, 4]])
print(mat)
# 输出:
# [[1 2]
# [3 4]]
# 从字符串创建矩阵(元素用空格分隔,行用分号分隔)
mat_str = np.matrix('1 2; 3 4')
print(mat_str)
# 输出:
# [[1 2]
# [3 4]]
2.2 从 ndarray
转换
# 从 ndarray 转换为 matrix
arr = np.array([[1, 2], [3, 4]])
mat = np.matrix(arr)
print(mat)
# 输出:
# [[1 2]
# [3 4]]
2.3 使用 np.mat
(别名)
np.mat
是 np.matrix
的简写,功能相同:
mat = np.mat([[1, 2], [3, 4]])
print(mat)
# 输出:
# [[1 2]
# [3 4]]
2.4 一维数据自动转为二维
即使输入一维数据,matrix
也会将其转换为二维矩阵:
mat = np.matrix([1, 2, 3])
print(mat) # 输出: [[1 2 3]] (1×3 矩阵)
3. 主要操作
numpy.matrix
提供了一些专为矩阵设计的便捷操作,以下是常见功能。
3.1 矩阵乘法
在 matrix
类中,*
运算符直接执行矩阵乘法,而非 ndarray
的逐元素乘法。
A = np.matrix([[1, 2], [3, 4]])
B = np.matrix([[5, 6], [7, 8]])
result = A * B
print(result)
# 输出:
# [[19 22]
# [43 50]]
对比 ndarray
:
A_arr = np.array([[1, 2], [3, 4]])
B_arr = np.array([[5, 6], [7, 8]])
result_arr = A_arr @ B_arr # 使用 @ 进行矩阵乘法
print(result_arr)
# 输出同上
# 注意:A_arr * B_arr 是逐元素乘法,结果不同
3.2 矩阵转置
使用 .T
属性获取矩阵转置:
A = np.matrix([[1, 2], [3, 4]])
print(A.T)
# 输出:
# [[1 3]
# [2 4]]
3.3 共轭转置
对于复数矩阵,使用 .H
获取共轭转置:
A = np.matrix([[1+1j, 2], [3, 4]])
print(A.H)
# 输出:
# [[1.-1.j 3.-0.j]
# [2.-0.j 4.-0.j]]
3.4 矩阵的逆
使用 .I
属性计算方阵的逆(矩阵必须非奇异):
A = np.matrix([[1, 2], [3, 4]])
A_inv = A.I
print(A_inv)
# 输出:
# [[-2. 1. ]
# [ 1.5 -0.5]]
# 验证:A * A_inv 应为单位矩阵
print(A * A_inv)
# 输出:
# [[1. 0.]
# [0. 1.]]
3.5 矩阵的行列式
使用 np.linalg.det()
计算行列式(matrix
本身没有直接的 .det
属性):
A = np.matrix([[1, 2], [3, 4]])
det = np.linalg.det(A)
print(det) # 输出: -2.0
4. 副本与视图
与 ndarray
类似,numpy.matrix
的操作也涉及副本和视图:
- 视图:切片操作(如
A[0, :]
)返回视图,修改会影响原始矩阵。 - 副本:使用
.copy()
方法创建独立副本,修改不影响原始矩阵。 - 注意:
matrix
对象的切片结果仍是matrix
类型,而不是ndarray
。
示例:
A = np.matrix([[1, 2], [3, 4]])
A_view = A[0, :] # 视图
A_view[0, 0] = 99
print(A) # 输出: [[99 2] [3 4]]
A_copy = A.copy() # 副本
A_copy[0, 0] = 88
print(A) # 输出: [[99 2] [3 4]] (未受影响)
5. numpy.matrix
vs numpy.ndarray
以下是 matrix
和 ndarray
的主要区别:
特性 | numpy.matrix | numpy.ndarray |
---|---|---|
维度 | 始终二维 | 支持任意维度 |
乘法运算符 | * 表示矩阵乘法 | * 表示逐元素乘法,@ 用于矩阵乘法 |
逆矩阵 | .I 属性 | 使用 np.linalg.inv() |
转置 | .T 和 .H | .T 或 np.transpose() |
灵活性 | 仅限矩阵运算,功能较窄 | 通用性强,支持多维数组操作 |
官方推荐 | 不推荐,未来可能废弃 | 推荐使用 |
为什么不推荐 matrix
?
- 限制性:
matrix
强制二维,难以处理高维数据(如张量)。 - 混淆风险:
*
的行为与ndarray
不同,可能导致代码逻辑错误。 - 功能重叠:
ndarray
配合numpy.linalg
和@
运算符可以实现所有matrix
的功能,且更灵活。
6. 常见应用场景
尽管不推荐使用 matrix
,它在某些场景下仍因语法简洁而有用,例如:
- 教学或快速原型:矩阵乘法和逆矩阵的简洁写法适合初学者。
- 小规模线性代数任务:如简单线性方程组或矩阵运算。
示例:线性方程组
使用 matrix
求解 Ax = b
:
A = np.matrix([[2, 1], [1, 3]])
b = np.matrix([[5], [10]]) # 列向量
x = A.I * b
print(x)
# 输出:
# [[1.]
# [3.]]
对比 ndarray
:
A_arr = np.array([[2, 1], [1, 3]])
b_arr = np.array([5, 10])
x_arr = np.linalg.solve(A_arr, b_arr)
print(x_arr) # 输出: [1. 3.]
7. 注意事项
- 避免在新代码中使用:除非有特殊需求(如教学或快速测试),应优先使用
ndarray
和numpy.linalg
。 - 矩阵形状:
matrix
始终保持二维,切片结果也是matrix
类型,可能导致意外行为。 - 性能:
matrix
的性能与ndarray
相似,但功能较窄,复杂任务可能需要转换回ndarray
。 - 与
numpy.linalg
配合:matrix
对象可直接用于numpy.linalg
的函数(如la.det()
、la.eig()
)。
8. 总结
numpy.matrix
是一个专门为二维矩阵设计的类,提供矩阵乘法(*
)、逆(.I
)、转置(.T
)等便捷操作。- 局限性:仅限二维,功能不如
ndarray
灵活,官方不推荐使用。 - 替代方案:使用
numpy.ndarray
结合@
运算符和numpy.linalg
模块,能完全替代matrix
的功能。 - 建议:新项目应避免使用
matrix
,优先使用ndarray
以确保代码通用性和可维护性。
如果需要更具体的 matrix
用法示例或与 ndarray
的进一步对比,请告诉我!