You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用NumPy高效将27×27 ndarray映射为25维向量?

高效实现27×27矩阵到指定区块求和向量的转换(NumPy)

给定一个27×27的整数型NumPy数组A,需将其转换为长度为25的向量b,每个元素对应A中特定矩形区块的元素总和(具体区块对应逻辑如下方示例及层级结构)。要求通过NumPy原生函数高效实现,避免手动逐个计算区块和或冗余的矩阵乘法操作。

核心思路

观察区块结构可发现,所有求和目标呈现三层层级拆分逻辑:

  1. 最外层8个9×9的大区块
  2. 中间9×9区域内拆分出的8个3×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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:05:06