如何高效提取3D特征图的2D切片以实现内存友好的可视化
提取特征图切片(仅视图,无内存拷贝)
刚好处理过类似的需求,针对你这个形状为(32, 32, 96)的numpy特征图,要获取每个(32, 32)的切片视图非常简单,完全不需要额外拷贝内存,下面给你两种实用方法:
方法一:逐个遍历获取切片视图
如果需要逐个处理这些特征图切片,直接通过索引遍历第三个维度就行,拿到的都是原数组的视图:
import numpy as np feature_map = np.random.randint(low=0, high=255, size=(32, 32, 96)) # 遍历所有96个特征图切片 for idx in range(feature_map.shape[-1]): # 这里拿到的slice_view是原数组的视图,没有内存拷贝 slice_view = feature_map[:, :, idx] # 可以在这里直接做可视化操作,比如用matplotlib显示 # import matplotlib.pyplot as plt # plt.imshow(slice_view, cmap='gray') # plt.show() # 验证是视图的小技巧:修改切片会同步到原数组 # slice_view[0, 0] = 0 # print(feature_map[0, 0, idx]) # 会输出0,说明确实是视图
方法二:一次性生成所有切片的视图集合
如果想一次性得到所有切片的视图集合,用np.moveaxis调整维度顺序就可以,这个操作完全不占额外内存:
# 将第三个维度(通道/特征图维度)移到第一个位置 # 得到形状为(96, 32, 32)的数组,每个元素都是原数组的视图 all_slices = np.moveaxis(feature_map, -1, 0) # 现在all_slices[i]就是第i个(32,32)的特征图切片视图
这个方法更高效,尤其是当你需要批量处理所有切片的时候,np.moveaxis只是调整了数组的维度元信息,没有复制任何数据。
确认是视图的小验证
你可以随手验证一下:
all_slices[0][0, 0] = 255 print(feature_map[0, 0, 0]) # 输出255,说明修改切片会同步到原数组,确实是视图
这样操作既满足了可视化的需求,又不会浪费内存,特别适合处理大尺寸的特征图~
内容的提问来源于stack exchange,提问作者kmario23
相关产品推荐
相关产品推荐

