如何用NumPy高效将27×27 ndarray映射为25维向量?
高效实现27×27矩阵到指定区块求和向量的转换(NumPy)
给定一个27×27的整数型NumPy数组A,需将其转换为长度为25的向量b,每个元素对应A中特定矩形区块的元素总和(具体区块对应逻辑如下方示例及层级结构)。要求通过NumPy原生函数高效实现,避免手动逐个计算区块和或冗余的矩阵乘法操作。
核心思路
观察区块结构可发现,所有求和目标呈现三层层级拆分逻辑:
- 最外层8个9×9的大区块
- 中间9×9区域内拆分出的8个3×3区块
- 最中心3×3区域内的9个1×1区块(即元素本身)
利用NumPy的reshape和sum向量化操作,分层计算各区块的和,最后拼接结果即可,全程无冗余计算。
实现代码
import numpy as np # 假设A是已定义的27×27整数数组(示例用随机数生成) A = np.random.randint(0, 10, (27, 27)) # 1. 计算最外层8个9×9区块的和 large_blocks = A.reshape(3, 9, 3, 9).sum(axis=(1, 3)) # 移除中间的9×9区块(后续拆分处理),扁平化得到前8个元素 b_part1 = np.delete(large_blocks, (1, 1)).flatten() # 2. 计算中间9×9区域内8个3×3区块的和 middle_block = A[9:18, 9:18] medium_blocks = middle_block.reshape(3, 3, 3, 3).sum(axis=(1, 3)) # 移除中间的3×3区块(后续拆分处理),扁平化得到中间8个元素 b_part2 = np.delete(medium_blocks, (1, 1)).flatten() # 3. 计算最中心3×3区域内的9个1×1区块的和(即元素本身) core_block = middle_block[3:6, 3:6] # 对应原A的[12:15, 12:15] b_part3 = core_block.flatten() # 拼接所有部分得到最终向量b b = np.concatenate([b_part1, b_part2, b_part3]) # 验证长度:8+8+9=25,符合要求 assert len(b) == 25
优势说明
- 全程使用NumPy向量化操作,避免Python循环或手动索引计算,性能最优
- 仅遍历矩阵一次完成所有分块求和,时间复杂度为O(27×27),远低于矩阵乘法方案的O(27²×25)
- 逻辑完全匹配区块层级结构,易于理解和维护
内容的提问来源于stack exchange,提问作者Sanjeev Rajakumar
相关产品推荐
相关产品推荐

