如何使用numpy修改NxN矩阵的m×m子矩阵实现数值交替排布
N×N交替m×m子块矩阵的高效实现
你可以用numpy的向量化操作完全避免循环,运行效率远高于手写多层循环,以下是两种通用实现方案:
方案1:repeat扩展法
import numpy as np # 可按需修改以下参数 N = 6 # 最终矩阵大小 m = 2 # 子块大小 val1 = 0 # 第一种子块的取值 val2 = 1 # 第二种子块的取值 block_num = N // m # 生成块级交替的棋盘矩阵 block_grid = (np.arange(block_num)[:, np.newaxis] + np.arange(block_num)) % 2 # 把每个块扩展为m×m大小,替换为对应取值 res = np.where(block_grid.repeat(m, axis=0).repeat(m, axis=1) == 0, val1, val2) print(res)
逻辑说明
- 先计算一共需要多少个子块:
block_num = N // m(要求N必须是m的整数倍,否则不满足均匀排布子块的需求) - 生成
block_num × block_num的棋盘矩阵,每个位置的值根据坐标和模2交替为0、1,对应两种子块的类型 - 用
repeat方法在行、列维度各重复m次,将每个块的位置放大为m×m的实际大小 - 最后用
np.where把0、1替换为你需要的任意取值,不需要局限于0和1
方案2:克罗内克乘积法
如果你熟悉克罗内克乘积,可以用更简洁的写法实现相同效果:
import numpy as np N = 6 m = 2 val1 = 0 val2 = 1 block_num = N // m block_grid = (np.arange(block_num)[:, np.newaxis] + np.arange(block_num)) % 2 res = np.kron(block_grid, np.full((m, m), val2)) + np.kron(1 - block_grid, np.full((m, m), val1)) print(res)
两种方案都是完全基于numpy底层C实现的运算,没有Python层面的循环,当矩阵规模较大时性能比四层循环高出几个数量级,同时可读性也更好。
内容的提问来源于stack exchange,提问作者user17539312
相关产品推荐
相关产品推荐

