关于numpy.save保存0维数组的原因及维度转换问题咨询
人体姿态估计热力图异常问题处理
问题背景
使用人体姿态估计模型生成姿态热力图,数组形状为[p k h w](其中p为帧中人数,k为关键点数量,h/w为热力图高/宽),通过numpy.save保存数组。处理15000个视频(约100万帧)后,发现10-15帧的保存文件形状为[0 17 96 72],存在两个疑问:
1. 为何会生成并保存维度为0的数组?
这是主流姿态估计模型的标准化设计:
- 为了维持输出结构的一致性,方便后续批量处理(如数组拼接、循环遍历),模型检测不到人体时,不会返回
None,而是返回人数维度p为0的空数组。这种设计能避免因返回值类型不一致导致的代码报错,尤其在批量推理场景下更实用。 - 你直接用
numpy.save写入了这个空数组,因此磁盘文件保留了[0,17,96,72]的形状。
2. 能否将[0 17 96 72]的数组转换为[1 17 96 72]?
可以实现,但需明确:原0维度数组无有效姿态数据,转换后的数组只能用默认值填充,无法恢复真实姿态。具体方法如下:
- 无需使用
numpy.squeeze()(该方法用于压缩维度为1的轴,与当前需求相反),直接生成对应形状的数组即可。示例代码:
import numpy as np # 加载异常的npy文件 abnormal_arr = np.load("path/to/your/abnormal_file.npy") # 生成[1,17,96,72]形状的全0数组(可根据需求替换为其他默认值) corrected_arr = np.zeros((1, 17, 96, 72), dtype=abnormal_arr.dtype) # 保存修正后的数组 np.save("path/to/save/corrected_file.npy", corrected_arr)
- 如果只是需要调整维度结构而非填充数值,也可以用
np.expand_dims结合空数组,但实际场景下全0占位是最常用的方案。
内容的提问来源于stack exchange,提问作者NitishJaiswal
相关产品推荐
相关产品推荐

