使用allow_pickle=True加载字典后遇'unsized object'类型错误求助
解决字典numpy保存加载后无法获取长度的问题
问题原因
当你用np.save保存非numpy原生类型(比如Python字典)时,numpy会把字典包装成一个0维numpy数组(对象类型)。加载后得到的mak并不是原字典,而是这个0维数组,所以调用len()会抛出TypeError: len() of unsized object——因为0维数组没有可测量的长度。
快速修复
加载时需要提取数组内部的字典对象,通过[()]索引即可:
with open('opp2b.npy', 'rb') as f: mak = np.load(f, allow_pickle=True)[()] # 添加[()]提取字典 mp = np.load(f, allow_pickle=True)[()]
此时mak会恢复为原字典,调用len(mak)就能得到预期的82。
更优的保存方案
用np.save保存字典并不是最佳选择,推荐以下几种方式:
1. 直接使用pickle
pickle是Python原生的序列化工具,专门用于保存Python对象:
# 保存 import pickle with open('opp2b.pkl', 'wb') as f: pickle.dump((mak, mp), f) # 加载 with open('opp2b.pkl', 'rb') as f: mak, mp = pickle.load(f)
2. 使用numpy的savez(适合多对象)
np.savez可以一次性保存多个对象,对于字典需指定allow_pickle=True:
# 保存 np.savez('opp2b.npz', mak=mak, mp=mp, allow_pickle=True) # 加载 data = np.load('opp2b.npz', allow_pickle=True) mak = data['mak'][()] mp = data['mp'][()]
3. 使用json(如果字典内容可序列化)
如果字典的键值都是字符串、数字等可json序列化的类型,json是更安全且跨语言的选择:
import json # 保存 with open('opp2b.json', 'w') as f: json.dump({'mak': mak, 'mp': mp}, f) # 加载 with open('opp2b.json', 'r') as f: data = json.load(f) mak = data['mak'] mp = data['mp']
内容的提问来源于stack exchange,提问作者Rafaella Chiarella
相关产品推荐
相关产品推荐

