
本文介绍利用 reshape 与 moveaxis 组合操作,无需循环即可将二维矩阵按指定分块规则(如 4×4 拆为 2×2 个 2×2 子块)快速提取为 a、b、c、d 四个子块矩阵。
本文介绍利用 reshape 与 moveaxis 组合操作,无需循环即可将二维矩阵按指定分块规则(如 4×4 拆为 2×2 个 2×2 子块)快速提取为 a、b、c、d 四个子块矩阵。
在科学计算和线性代数应用中,常需将一个大矩阵按行、列均匀划分成若干子块(block matrix),例如将 4×4 矩阵划分为四个 2×2 块:左上(A)、右上(B)、左下(C)、右下(D)。NumPy 提供了高度向量化的方法,避免显式 for 循环,兼顾性能与简洁性。
核心思路是:利用 reshape 改变维度结构,再用 moveaxis 调整轴顺序,使逻辑上的“块结构”映射到数组的高维形状中,最后通过解包直接获取各子块。
以 4×4 矩阵为例:
import numpy as np
# 示例数据(字符串便于观察索引)
Matrix = np.array([['A11', 'A12', 'A13', 'A14'],
['A21', 'A22', 'A23', 'A24'],
['A31', 'A32', 'A33', 'A34'],
['A41', 'A42', 'A43', 'A44']])
# 方法一:单行解包(推荐)
(A, B), (C, D) = np.moveaxis(Matrix.reshape(2, 2, 2, 2), 1, 2)该语句执行过程如下:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
-
Matrix.reshape(2, 2, 2, 2)将(4, 4)数组重塑为(2, 2, 2, 2)—— 即:[块行, 块列, 行内索引, 列内索引]; -
np.moveaxis(..., 1, 2)将第 1 轴(原“块列”)移到第 2 位,得到新形状(2, 2, 2, 2)→ 实际轴序变为[块行, 行内索引, 块列, 列内索引],此时前两维可自然索引为(A,B)和(C,D); - 最终解包
(A, B), (C, D)直接对应四块子矩阵,每块均为2×2的 ndarray。
✅ 输出验证:
print("A:\n", A)
# [['A11' 'A12']
# ['A21' 'A22']]
print("B:\n", B)
# [['A13' 'A14']
# ['A23' 'A24']]对于任意偶数尺寸的方阵(如 N×N, N 为偶数),可泛化为:
x, y = Matrix.shape assert x % 2 == 0 and y % 2 == 0 (A, B), (C, D) = np.moveaxis(Matrix.reshape(2, x//2, 2, y//2), 1, 2)
⚠️ 注意事项:
- 输入矩阵行列数必须能被目标块数整除(如划为 2×2 块,则长宽均需为偶数);
-
moveaxis不复制数据,仅改变视图,因此高效且内存友好; - 若需非均匀分块(如不等大小子块),应改用切片(
Matrix[:2,:2]等),但本方法在规则分块场景下更简洁、更具扩展性(如推广至 3×3 分块只需调整 reshape 参数)。
总结:掌握 reshape + moveaxis 的组合技巧,是 NumPy 高级索引能力的重要体现——它将“逻辑分块”转化为“维度重排”,让块矩阵操作真正实现向量化、声明式与高性能统一。

















