高效构建由对称子矩阵组成的三维数组
本文介绍如何利用 numpy 的广播式高级索引无需显式循环即可批量提取二维数组中多个由不同索引集定义的对称子矩阵并堆叠为三维数组显著提升性能。 本文介绍如何利用 numpy 的广播式高级索引无需显式循环即可批量提取二维数组中多个由不同索引集定义的对称子矩阵并堆叠为三维数组显著提升性能。在科学计算与矩阵分析中常需从一个大型二维数组 A如协方差矩阵、相似度矩阵中按多组索引集合批量提取对称子矩阵即形如 A[idx, :][:, idx] 的方阵并将结果统一组织为三维数组 B其中 B[i] 对应第 i 组索引所确定的子矩阵。若采用 Python 循环配合列表推导式如 [A[idx, :][:, idx] for idx in I]虽逻辑清晰但在大规模数据下性能极差——每次索引均触发独立内存拷贝与 Python 解释器开销。幸运的是NumPy 提供了广播式高级索引broadcasted advanced indexing 这一强大机制可一次性完成全部子矩阵提取。核心技巧在于合理扩展索引数组 I 的维度使其与 A 的二维结构对齐B A[I[:, :, None], I[:, None, :]]该表达式中I 形状为 (N, K)表示 N 组、每组 K 个索引I[:, :, None] 将其扩展为 (N, K, 1)用于索引 A 的行维度I[:, None, :] 将其扩展为 (N, 1, K)用于索引 A 的列维度利用 NumPy 广播规则二者共同生成 (N, K, K) 的索引组合最终 A[...] 返回形状为 (N, K, K) 的三维数组 B完美对应需求。? 验证示例 腾讯小微 基于微信AI智能对话系统打造的智能语音助手解决方案