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.matnp.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

以下是 matrixndarray 的主要区别:

特性numpy.matrixnumpy.ndarray
维度始终二维支持任意维度
乘法运算符* 表示矩阵乘法* 表示逐元素乘法,@ 用于矩阵乘法
逆矩阵.I 属性使用 np.linalg.inv()
转置.T.H.Tnp.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. 注意事项

  1. 避免在新代码中使用:除非有特殊需求(如教学或快速测试),应优先使用 ndarraynumpy.linalg
  2. 矩阵形状matrix 始终保持二维,切片结果也是 matrix 类型,可能导致意外行为。
  3. 性能matrix 的性能与 ndarray 相似,但功能较窄,复杂任务可能需要转换回 ndarray
  4. numpy.linalg 配合matrix 对象可直接用于 numpy.linalg 的函数(如 la.det()la.eig())。

8. 总结

  • numpy.matrix 是一个专门为二维矩阵设计的类,提供矩阵乘法(*)、逆(.I)、转置(.T)等便捷操作。
  • 局限性:仅限二维,功能不如 ndarray 灵活,官方不推荐使用。
  • 替代方案:使用 numpy.ndarray 结合 @ 运算符和 numpy.linalg 模块,能完全替代 matrix 的功能。
  • 建议:新项目应避免使用 matrix,优先使用 ndarray 以确保代码通用性和可维护性。

如果需要更具体的 matrix 用法示例或与 ndarray 的进一步对比,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注