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

如何将128×128的NumPy数组分割为16×16块并优化重组内存

NumPy图像数组的分块与高效重组

你的需求是把(5,128,128)的数组分割成64个16×16的块,再重组回原尺寸。原来的循环写法效率低且内存开销大,推荐用NumPy的reshape和transpose实现向量化操作,避免Python层面的循环,同时减少内存占用。

1. 高效分块代码

直接通过维度变换实现分块,无需手动循环赋值:

import numpy as np

# 生成测试数据
xpx = np.random.rand(5, 128, 128)

# 分块操作:(5,128,128) → (5,64,16,16)
blocks = xpx.reshape(5, 8, 16, 8, 16).transpose(0, 1, 3, 2, 4).reshape(5, 64, 16, 16)

步骤解释:

  • reshape(5,8,16,8,16):将原数组的128×128维度拆分为8×16(高度)和8×16(宽度),对应把图像分成8行8列的16×16块
  • transpose(0,1,3,2,4):调整维度顺序,把两个代表块位置的维度(8和8)放在一起,变成(5,8,8,16,16)
  • reshape(5,64,16,16):把8×8的块位置维度合并成64,得到最终的分块数组

2. 重组回原尺寸

分块的逆操作即可恢复原数组:

# 重组操作:(5,64,16,16) → (5,128,128)
reconstructed = blocks.reshape(5, 8, 8, 16, 16).transpose(0,1,3,2,4).reshape(5,128,128)

步骤解释:

  • reshape(5,8,8,16,16):先把64拆回8×8的块位置维度
  • transpose(0,1,3,2,4):还原分块时的维度顺序
  • reshape(5,128,128):合并8×16的维度,恢复原数组尺寸

3. 验证正确性

可以用np.allclose验证重组后的数组和原数组是否一致:

print(np.allclose(xpx, reconstructed))  # 输出True表示完全一致

为什么比你的原代码好?

  • 无需Python循环:NumPy的内置操作是C层面实现的,速度远超手动循环
  • 内存开销小:reshape和transpose多数情况下会创建数组视图而非复制数据,大幅减少内存占用;即使需要复制,也比循环逐个赋值高效得多

内容的提问来源于stack exchange,提问作者sab sab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:20:14