不使用np.concatenate/np.append将3D NumPy数组转2D及绘图问题问询
高效数组转换方案
你需要的转换可以通过transpose+reshape的组合实现,该方案属于零拷贝操作,仅修改数组的元数据(形状、轴步长),不会复制底层数据,性能远高于np.concatenate/np.append,哪怕是TB级的数组也能瞬间完成。
你的原始3D数组形状为(N, H, W)(示例中N=4, H=3, W=5),转换为(H, N*W)的目标2D数组的代码如下:
import numpy as np import matplotlib.pyplot as plt # 原始3D数组示例 x = np.array([[[8, 7, 1, 0, 3], [2, 8, 5, 5, 2], [1, 1, 1, 1, 1]], [[8, 4, 1, 0, 0], [6, 8, 5, 5, 2], [1, 1, 1, 1, 1]], [[2, 4, 0, 2, 3], [2, 5, 5, 3, 2], [1, 1, 1, 1, 1]], [[4, 7, 2, 8, 0], [1, 3, 6, 5, 2], [1, 1, 1, 1, 1]]]) # 仅需这一行完成转换,无额外内存开销 x_2d = x.transpose(1, 0, 2).reshape(x.shape[1], -1)
转换逻辑说明:
transpose(1,0,2)将原数组的轴顺序从[块序号, 行号, 行内元素]调整为[行号, 块序号, 行内元素],形状变为(3,4,5)reshape(x.shape[1], -1)将后两个维度展开,按顺序拼接同一行号下所有块的行数据,最终得到(3, 20)的目标数组
绘图方案说明
Matplotlib的imshow仅支持2D单通道数组、3D RGB/RGBA数组作为输入,你需要的横向拼接展示效果无法直接传入原始3D数组实现。但上述transpose+reshape的转换几乎没有性能和内存损耗,实际使用时可以直接在imshow中 inline 调用,和直接使用原始数组的体验没有区别:
plt.imshow(x.transpose(1, 0, 2).reshape(x.shape[1], -1)) plt.show()
内容的提问来源于stack exchange,提问作者mehmet_kacmaz_03
相关产品推荐
相关产品推荐

