NumPy 9x9数组划分3x3子块及索引映射实现方法咨询
9x9数组切分3x3子块实现方案
无判断坐标映射方法
不需要多层if分支,通过整数除法和取模运算就能完成所有坐标转换:
- 子块内局部坐标计算:对主数组行、列索引分别模3即可
对应给出的两个测试用例:local_i = i % 3 local_j = j % 3- 主坐标(2,3):2%3=2,3%3=0 → 局部坐标(2,0),符合预期
- 主坐标(4,0):4%3=1,0%3=0 → 局部坐标(1,0),符合预期
- 子块ID计算:先通过地板除拿到坐标所属的3行组、3列组序号,再按ID排布规则计算即可
- 若ID按原有if逻辑排布(同列块从上到下排ID,列块从左到右递增,列优先):
计算结果和多层if判断输出完全一致。block_row = i // 3 # 取值0/1/2,对应上、中、下三个3行组 block_col = j // 3 # 取值0/1/2,对应左、中、右三个3列组 section_id = block_col * 3 + block_row - 若ID按最开始描述的分块规则排布(同行块从左到右排ID,行块从上到下递增,行优先):
按这个规则,行0-2列0-2为id0、行0-2列3-5为id1、行0-2列6-8为id2,依次顺延。block_row = i // 3 block_col = j // 3 section_id = block_row * 3 + block_col
- 若ID按原有if逻辑排布(同列块从上到下排ID,列块从左到右递增,列优先):
循环赋值实现
用上述公式替换分支判断,即可简洁完成所有子块赋值:
import numpy as np some_9x9_array = [ [3, 0, 0, 4, 0, 9, 0, 0, 5], [0, 0, 0, 3, 1, 0, 4, 6, 0], [0, 0, 0, 7, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 2, 0, 0, 0], [6, 0, 7, 1, 3, 0, 0, 0, 0], [0, 0, 0, 5, 0, 0, 0, 7, 2], [0, 0, 0, 0, 0, 0, 0, 0, 3], [9, 0, 0, 0, 4, 0, 7, 0, 0], [0, 8, 0, 0, 2, 0, 0, 9, 0], ] main_grid = np.array(some_9x9_array, dtype=int) grid_sections = [np.zeros((3,3), dtype=int) for _ in range(9)] for i in range(9): for j in range(9): block_row = i // 3 block_col = j // 3 section_id = block_col * 3 + block_row # 匹配原有if逻辑的ID顺序 li, lj = i % 3, j % 3 grid_sections[section_id][li, lj] = main_grid[i, j]
numpy原生高效实现
不需要手动写双层循环,直接通过numpy的reshape和轴变换就能一次性生成子块列表,运行效率远高于手写循环:
- 生成和原有if逻辑ID顺序一致的子块列表:
grid_sections = main_grid.reshape(3,3,3,3).transpose(1,0,2,3).reshape(9,3,3) - 生成行优先顺序的子块列表(即最开始描述的同行块从左到右排布的规则):
grid_sections = main_grid.reshape(9, 3, 3)
生成的列表支持直接通过ID索引访问对应子块,结果和手动循环赋值完全一致。
内容的提问来源于stack exchange,提问作者Chema
相关产品推荐
相关产品推荐

