构建重叠数组的加权拼接:使用 SciPy 实现矩阵区域对齐与平均融合

张开发
2026/4/12 10:49:58 15 分钟阅读

分享文章

构建重叠数组的加权拼接:使用 SciPy 实现矩阵区域对齐与平均融合
本文介绍如何在 numpy/scipy 中实现两个二维数组的可控重叠拼接——通过指定重叠宽度使对应位置元素取平均非重叠区保留原值并支持稀疏结构扩展。 本文介绍如何在 numpy/scipy 中实现两个二维数组的可控重叠拼接——通过指定重叠宽度使对应位置元素取平均非重叠区保留原值并支持稀疏结构扩展。在科学计算与图像处理中常需将多个局部数据块如分块矩阵、滑动窗口结果或分布式子域解沿某一维度“缝合”stitch为统一结构。不同于 scipy.linalg.block_diag 的零填充对角拼接真实场景往往要求可控重叠与平滑过渡例如两个 3×3 矩阵沿行/列方向重叠 2 个单元时重叠区域的对应元素应加权平均默认等权而非硬切换或截断。以下以两个 3×3 数组为例演示如何构造一个 4×4 的重叠融合矩阵import numpy as npfrom scipy.linalg import block_diagA np.linspace(1, 9, 9).reshape(3, 3)B np.linspace(10, 18, 9).reshape(3, 3)overlap 2 # 指定重叠行/列数此处为 2核心思想是 将 A 左上对齐、B 右下对齐使二者在中间 overlap × overlap 区域重叠 构造两个掩模矩阵Sum 和 Denom分别记录各位置的数值总和与参与求和的矩阵个数 利用 np.where 对非零分母位置执行逐元素除法实现自动平均。具体实现如下# 计算填充尺寸确保 A 在左上、B 在右下重叠为 overlappad_A A.shape[0] - overlap # A 下方/右侧需补零行数pad_B B.shape[0] - overlap # B 上方/左侧需补零行数# 构建零填充块保持形状一致ZerosA np.zeros((pad_A, pad_A))ZerosB np.zeros((pad_B, pad_B))# 构造叠加矩阵A 占左上B 占右下 → 重叠区自动相加Sum block_diag(A, ZerosA) block_diag(ZerosB, B)# 构造计数矩阵1 表示该位置被 A 或 B 覆盖重叠区为 2Denom block_diag(np.ones_like(A), ZerosA) block_diag(ZerosB, np.ones_like(B))# 安全平均仅对 Denom 0 的位置执行除法其余置 0Out np.where(Denom 0, Sum / Denom, 0)print(Out)输出结果为 千面数字人 千面 Avatar 系列音频转换让静图随声动起来动作模仿让动漫复刻真人动作操作简单满足多元创意需求。

更多文章