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

numpy加载npz文件返回NpzFile对象的原因及数据提取方法

原因说明

np.load()加载npz文件返回numpy.lib.npyio.NpzFile对象是正常的设计逻辑,不是异常。npz本身是多个numpy数组打包后的压缩归档格式,如果加载时就把所有数组全量解压读入内存,遇到存储了大体积数组的npz文件会直接占用大量内存,甚至触发OOM。因此NpzFile被设计为类字典的懒加载对象,不会在加载阶段读取实际数组内容,仅保留文件句柄和归档索引,只有用户主动访问对应数组时才会读取对应数据到内存,兼顾大文件加载的性能和内存占用。

另外你贴的复现代码里存在一个传参错误:调用np.savez_compressed时直接传入字典作为位置参数,numpy不会自动识别字典的键作为存储键名,最终存进npz的数组会被自动命名为arr_0,根本不会生成你预期的imgs、masks键,后续取值时会找不到对应数据。

从NpzFile提取数组的方法

NpzFile的使用逻辑和Python字典高度一致,常用的提取方式有两种:

  • 按需提取单个数组
    先通过.files属性查看npz内存储的所有数组的键名,再按键取值即可:
    loaded_data = np.load("/path/to/imgs_with_masks.npz")
    # 打印所有存在的数组键
    print(loaded_data.files)
    # 按键取对应numpy数组
    imgs = loaded_data["imgs"]
    masks = loaded_data["masks"]
    # 用完记得关闭对象释放文件句柄
    loaded_data.close()
    
    更推荐用with上下文管理器写法,会自动完成资源释放,避免句柄泄漏:
    with np.load("/path/to/imgs_with_masks.npz") as loaded_data:
        imgs = loaded_data["imgs"]
        masks = loaded_data["masks"]
    
  • 一次性加载所有数组为普通字典
    如果npz文件体积不大,不需要懒加载,可以直接把NpzFile转为普通Python字典,转换完成后就算关闭原NpzFile对象,字典内的数组也可以正常使用:
    with np.load("/path/to/imgs_with_masks.npz") as loaded_data:
        all_data = dict(loaded_data)
    # 出了with块后可以直接从字典取数,不需要依赖原文件句柄
    print(type(all_data["imgs"])) # 输出<class 'numpy.ndarray'>
    
修正后的完整可运行示例

针对你最开始的复现代码,修正存文件时的传参错误(需要用**解包字典)之后的完整代码如下:

import numpy as np

imgs = np.ones((3,32,32,3))
masks = np.ones((3,32,32,1))
array_dict = {"imgs" : imgs, "masks": masks}
# 注意这里要**解包字典,才能用字典的键作为npz内的数组名
np.savez_compressed("/path/to/imgs_with_masks.npz", **array_dict)

with np.load("/path/to/imgs_with_masks.npz") as loaded_data:
    print(type(loaded_data), " - ", loaded_data.files)
    all_data = dict(loaded_data)

print(all_data.keys()) # 输出dict_keys(['imgs', 'masks'])
print(type(all_data["imgs"])) # 输出<class 'numpy.ndarray'>
  • 注意:不要在NpzFile对象关闭后再尝试从中取值,懒加载机制依赖打开的文件句柄,关闭后再访问键会抛出IO错误,需要使用的数组请在关闭前提取,或提前转为普通字典。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 04:21:12