本文介绍一种基于 scipy.linalg.block_diag 的通用方法,用于将两个二维数组沿对角线方向可控重叠拼接,并对重叠区域元素自动取平均,支持指定重叠宽度,且天然兼容稀疏矩阵扩展。
本文介绍一种基于 scipy.linalg.block_diag 的通用方法,用于将两个二维数组沿对角线方向可控重叠拼接,并对重叠区域元素自动取平均,支持指定重叠宽度,且天然兼容稀疏矩阵扩展。
在科学计算与信号处理中,常需将多个局部数据块(如分段矩阵、滑动窗口结果或子域解)按一定偏移量“缝合”成一个全局结构。不同于标准的块对角拼接(block_diag),实际场景往往要求相邻块存在可控重叠(overlap),并在重叠区域进行加权融合(如简单平均)。本文提供一种简洁、可扩展、内存友好的实现方案。
核心思想:掩码驱动的加权叠加
该方法不显式构造全尺寸稠密矩阵,而是利用 block_diag 构建带零填充的稀疏结构,通过分子累加与分母计数双通道叠加,再逐元除法完成平均——本质是“加权和 / 权重和”,其中权重为参与叠加的块数量(0 或 1 或 2)。
给定两个形状一致的方阵 A 和 B(此处均为 3×3),目标是实现 overlap=2 的重叠拼接(即中间 2 行/列重合),最终输出为 4×4 矩阵:
import numpy as np from scipy.linalg import block_diag A = np.linspace(1, 9, 9).reshape(3, 3) B = np.linspace(10, 18, 9).reshape(3, 3) overlap = 2
✅ 步骤详解
-
计算补零尺寸:为使 A 的右下角与 B 的左上角重叠 overlap 行列,需在 A 后添加 len(B) - overlap 行/列零垫,在 B 前添加 len(A) - overlap 行/列零垫:
pad_A = A.shape[0] - overlap # = 1 pad_B = B.shape[0] - overlap # = 1 ZerosA = np.zeros((pad_A, pad_A)) ZerosB = np.zeros((pad_B, pad_B))
-
构建分子(Sum)与分母(Denom)矩阵:
- Sum:A 左上块 + B 右下块 的块对角叠加(重叠区自然相加);
- Denom:对应位置的“参与计数”矩阵(1 表示该位置被 A 或 B 覆盖,2 表示被两者同时覆盖)。
Sum = block_diag(A, ZerosA) + block_diag(ZerosB, B) Denom = block_diag(np.ones_like(A), ZerosA) + block_diag(ZerosB, np.ones_like(B))
-
安全平均:使用 np.where 避免除零,仅对 Denom > 0 区域执行除法:
result = np.where(Denom > 0, Sum / Denom, 0.0)
完整可运行示例:
import numpy as np from scipy.linalg import block_diag A = np.linspace(1, 9, 9).reshape(3, 3) B = np.linspace(10, 18, 9).reshape(3, 3) overlap = 2 pad_A = A.shape[0] - overlap pad_B = B.shape[0] - overlap ZerosA = np.zeros((pad_A, pad_A)) ZerosB = np.zeros((pad_B, pad_B)) Sum = block_diag(A, ZerosA) + block_diag(ZerosB, B) Denom = block_diag(np.ones_like(A), ZerosA) + block_diag(ZerosB, np.ones_like(B)) result = np.where(Denom > 0, Sum / Denom, 0.0) print(result) # 输出: # [[ 1. 2. 3. 0. ] # [ 4. 7.5 8.5 12. ] # [ 7. 10.5 11.5 15. ] # [ 0. 16. 17. 18. ]]
✅ 关键优势与注意事项
- 稀疏友好:所有操作(block_diag、加法、np.ones_like)均可直接替换为稀疏等价物(如 scipy.sparse.bmat、scipy.sparse.eye),无需转稠密,适合大规模问题;
- 灵活重叠:overlap 参数可设为 0(退化为 block_diag)、1、2…直至 min(len(A), len(B)),超出则自动截断;
- 非方阵兼容:稍作修改即可支持 m×n 与 p×q 矩阵的行/列方向重叠(需分别计算行/列重叠尺寸);
- 加权扩展:若需加权平均(如 α*A + (1−α)*B),只需将 Sum 改为 α*block_diag(A, ZerosA) + (1−α)*block_diag(ZerosB, B),Denom 保持不变;
- 内存效率:全程避免全尺寸中间数组,尤其在稀疏实现下,存储与计算复杂度均与非零元数量线性相关。
总结
本方案以“结构化块叠加 + 掩码归一化”为核心,将重叠拼接抽象为可组合、可复用的线性代数操作。它不仅准确复现了需求中的平均融合行为,更提供了向稀疏计算、非均匀加权及高维推广的清晰路径,是构建分块算法、多分辨率矩阵合成或分布式数值求解器的理想基础组件。

















