Numpy如何自动将多个子块拼接生成目标二维数组
Numpy子矩阵自动拼接解决方案
自动拼接的核心逻辑是先明确子块的网格排布规则,再自动生成np.block需要的嵌套列表,无需手动编写排布结构。以下是两种常用场景的实现方案:
场景1:子块按行优先顺序存储,已知网格行列数
如果你的子矩阵在集合中按「先填完第一行所有子块,再填第二行,以此类推」的顺序存储,且已知子块排布的总网格行数grid_rows、总网格列数grid_cols,可以直接用数组reshape生成嵌套列表:
import numpy as np # 模拟你的子矩阵集合 set_of_arrays = [ np.array([[5, 3], [1, 5], [8, -1], [6, 6]]), # 网格(0,0)位置 np.array([[1,2,3,4,5,6], [4,5,6,7,8,9], [7,8,9,0,1,2], [0,1,2,3,4,5]]), # 网格(0,1)位置 np.array([[5,3], [5,3]]), # 网格(1,0)位置 np.array([[1,5,8,-1,6,6], [1,5,8,-1,6,6]]) # 网格(1,1)位置 ] # 配置子块网格参数 grid_rows = 2 grid_cols = 2 # 自动生成嵌套排布列表 block_nested_list = np.array(set_of_arrays, dtype=object).reshape(grid_rows, grid_cols).tolist() # 拼接得到目标矩阵 M = np.block(block_nested_list)
场景2:子块无固定存储顺序,已知每个子块的网格坐标
如果子块是零散存储的,你只需要提前整理出每个子块对应的「网格行索引、列索引」映射关系,即可自动填充嵌套列表:
import numpy as np # 模拟你的子矩阵集合 set_of_arrays = { 7: np.array([[5, 3], [1, 5], [8, -1], [6, 6]]), 8: np.array([[1,2,3,4,5,6], [4,5,6,7,8,9], [7,8,9,0,1,2], [0,1,2,3,4,5]]), 123: np.array([[5, 3, 1, 5, 8, -1, 6, 6], [5, 3, 1, 5, 8, -1, 6, 6]]) } # 配置子块网格参数与位置映射 grid_rows = 2 grid_cols = 2 block_pos_map = { (0, 0): set_of_arrays[7], (0, 1): set_of_arrays[8], (1, 0): set_of_arrays[123][:, :2], (1, 1): set_of_arrays[123][:, 2:] } # 自动生成嵌套排布列表 block_nested_list = [[None for _ in range(grid_cols)] for _ in range(grid_rows)] for (i, j), block in block_pos_map.items(): block_nested_list[i][j] = block # 拼接得到目标矩阵 M = np.block(block_nested_list)
注意事项
- 同网格行的所有子块高度必须一致,同网格列的所有子块宽度必须一致,你已经明确所有子块满足拼接要求,不会出现报错
- 如果子块数量不固定,只需要动态调整
grid_rows、grid_cols和映射规则即可,不需要修改核心拼接逻辑
内容的提问来源于stack exchange,提问作者Terzi Ak
相关产品推荐
相关产品推荐

