构建重叠数组的高效拼接方法:基于 scipy 的块对角矩阵加权融合技术
本文介绍如何使用 scipy 和 numpy 实现两个二维数组在指定重叠宽度下的无缝拼接通过块对角构造与掩码加权平均避免全矩阵显式分配天然支持稀疏结构扩展。 本文介绍如何使用 scipy 和 numpy 实现两个二维数组在指定重叠宽度下的无缝拼接通过块对角构造与掩码加权平均避免全矩阵显式分配天然支持稀疏结构扩展。在科学计算与图像/信号处理中常需将多个局部矩阵如分块求解结果、滑动窗口输出或区域拼接沿某维度“软连接”——即允许指定宽度的重叠并对重叠区域取平均值以实现平滑过渡。这不同于 scipy.linalg.block_diag 的零填充对角拼接而是一种带权重的重叠融合overlap stitching。本文提供一种简洁、可扩展、内存友好的实现方案核心思想是利用块对角矩阵的线性叠加与计数掩码实现逐元素加权平均。基本原理设两个形状均为 (n, n) 的方阵 A 和 B要求重叠宽度为 overlap此处指重叠行/列数本例中为 2。目标输出矩阵尺寸为 (n n - overlap, n n - overlap)。关键洞察在于将 A 左上对齐放置B 右下对齐放置二者在中间 (overlap, overlap) 区域自然重叠构造两个“位置掩码”矩阵一个标记 A 的有效区域其余为 0另一个标记 B 的有效区域对应位置相加得到分子值之和掩码相加得到分母覆盖次数再逐元素除法即得平均值。该方法完全基于线性代数运算不涉及循环或索引切片天然兼容 scipy.sparse 矩阵只需将 np.zeros 替换为 scipy.sparse.csr_matrixblock_diag 同样支持稀疏输入。实现代码稠密版import numpy as npfrom 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 占右下总尺寸 len(A) len(B) - overlapn A.shape[0]total_size n n - overlap# 构造零填充块A 需向下/右补 (n - overlap) 行/列B 需向上/左补同量pad_len n - overlapZerosA np.zeros((pad_len, pad_len))ZerosB np.zeros((pad_len, pad_len))# 分子A 和 B 在各自块对角位置叠加numerator block_diag(A, ZerosA) block_diag(ZerosB, B)# 分母计数掩码同结构用 1 替代实际值denominator block_diag(np.ones_like(A), ZerosA) block_diag(ZerosB, np.ones_like(B))# 加权平均仅对 denominator 0 的位置计算其余置 0result np.divide(numerator, denominator, outnp.zeros_like(numerator), wheredenominator!0)print(result)输出 WisPaper 复旦大学研发的AI学术搜索工具5分钟内筛选1000篇论文