为何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
相关产品推荐
相关产品推荐

