如何将1000个32×32的Numpy数组堆叠为250个64×64数组?
最优实现:将(1000,32,32)数组拼接为(250,64,64)
要实现每4个32×32数组按2×2网格拼接成64×64数组,最优方案是利用numpy的**形状重塑(reshape)和轴变换(transpose)**操作,全程使用向量化运算,避免循环,性能拉满。
核心思路
把原数组按每4个一组拆分,将每组4个32×32块重组为2行2列的网格,再合并成64×64的单个数组。
两种高效实现方法
方法一:分步拼接(直观易懂)
通过concatenate分步完成横向、纵向拼接,逻辑清晰:
import numpy as np # 假设输入为形状(1000,32,32)的numpy数组 original = np.random.rand(1000, 32, 32) # 1. 按每4个一组拆分 grouped = original.reshape(250, 4, 32, 32) # 2. 每组内横向拼接第0、1个元素,得到顶部32×64块 top_row = np.concatenate([grouped[:, 0], grouped[:, 1]], axis=2) # 3. 横向拼接第2、3个元素,得到底部32×64块 bottom_row = np.concatenate([grouped[:, 2], grouped[:, 3]], axis=2) # 4. 纵向拼接上下两行,得到最终(250,64,64)数组 result = np.concatenate([top_row, bottom_row], axis=1)
方法二:形状变换组合(性能最优)
利用reshape和transpose直接调整内存布局,无需额外数据复制,速度更快:
import numpy as np original = np.random.rand(1000, 32, 32) # 一步完成重组:reshape分组 → transpose调整轴顺序 → reshape合并维度 result = original.reshape(250, 2, 2, 32, 32).transpose(0, 1, 3, 2, 4).reshape(250, 64, 64)
方法二原理拆解
reshape(250,2,2,32,32):将1000个样本拆分为250组,每组是2行×2列的32×32小块,形状变为(250, 行, 列, 高度, 宽度)transpose(0,1,3,2,4):调整轴的顺序,把列轴和高度轴交换,使每组结构变为(250, 行, 高度, 列, 宽度),此时行内的列和宽度可以自然合并reshape(250,64,64):将2行×32高度合并为64高度,2列×32宽度合并为64宽度,直接得到目标形状
验证结果一致性
两种方法输出完全一致:
print(np.array_equal(result_method1, result_method2)) # 输出True
内容的提问来源于stack exchange,提问作者Krait
相关产品推荐
相关产品推荐

