将Numpy数组保存为字典后,加载结果无法按字典调用怎么办?
解决Numpy保存字典后无法按键访问的问题
我明白你遇到的问题了——用np.save存字典,加载后得到的是个ndarray,没法直接用键访问里面的数组对吧?这是因为np.save默认会把非数组对象(比如字典)包装成一个0维的ndarray存储,加载后你拿到的其实是包裹着字典的数组,自然不能直接用键索引啦。
下面给你两种靠谱的解决方案:
方案1:加载时启用pickle支持
如果你还是想用np.save的方式,只需要在加载的时候加上allow_pickle=True参数,让Numpy正确还原里面的字典对象:
import numpy as np x = np.arange(10) y = np.array([100, 101, 102, 103, 104, 105, 106, 107]) z = {'X': x, 'Y': y} np.save('./data.npy', z) # 加载时添加allow_pickle=True z1 = np.load('./data.npy', allow_pickle=True) print(type(z1)) # 现在输出是<class 'dict'> print(z1['X']) # 正常输出array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
不过要注意:pickle存在一定的安全风险,如果你加载的文件来源不可信,不建议用这个方法。
方案2:用np.savez专门存储多数组(更推荐)
Numpy提供了np.savez(或压缩版np.savez_compressed)来专门保存多个数组,这是更规范的做法,而且不需要依赖pickle:
import numpy as np x = np.arange(10) y = np.array([100, 101, 102, 103, 104, 105, 106, 107]) # 直接把数组作为关键字参数传入,键名就是你要的索引名 np.savez('./data.npz', X=x, Y=y) # 加载后得到NpzFile对象,用法和字典一致 z1 = np.load('./data.npz') print(z1['X']) # 正常输出目标数组 print(z1['Y']) # 用完记得关闭文件对象(或者用with语句) z1.close()
这种方式不仅安全,而且结构更清晰,适合存储多个关联的数组。
内容的提问来源于stack exchange,提问作者nairouz mrabah
相关产品推荐
相关产品推荐

