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

为何np.load加载压缩npz文件后原字典变为numpy.ndarray?

为什么存入npz的字典加载后变成了numpy.ndarray?

原因

  • np.savez_compressed(包括np.savez)本质是为存储numpy数组设计的。当你传入非数组类型的对象(比如代码里的字典b)时,它会自动用np.array()把这个对象包装成object类型的numpy数组——因为numpy需要统一用数组格式存储所有内容,而字典不属于numpy原生支持的数值数组类型,只能被塞进object数组里保存。
  • 加载时哪怕开了allow_pickle=True(允许反序列化Python对象),你拿到的还是这个object数组容器,不是直接返回原始字典。

解决方法

要拿到原始字典,只需要从object数组里取出内部的对象就行,常用两种方式:

  • 调用数组的item()方法
  • 用索引[()]取数组里的唯一元素

修改后的可运行代码

import numpy as np

D = {}
D["a"] = np.array([1, 2, 3, 4])
D["b"] = {1: 2, "3": "hey"}
np.savez_compressed("test.npz", **D)

x = np.load("test.npz", allow_pickle=True)
a = x["a"]
print(a, type(a))  # 输出:[1 2 3 4] <class 'numpy.ndarray'>

# 正确获取原始字典
b = x["b"].item()
print(b, type(b))  # 输出:{1: 2, '3': 'hey'} <class 'dict'>
print(b["3"])      # 输出:hey

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:05:19