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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:42:46