从pickled有向图加载数据生成numpy数组触发KeyError:0该如何解决
问题原因分析
- 核心报错触发逻辑:你在列表推导式中使用了
g[0],此处的g并不是嵌套了图对象的列表/元组,本身就是networkx的有向图实例。在networkx的规则中,对图对象使用[]运算符是查找对应ID的节点的邻接表,你读取的图中不存在ID为0的节点,因此直接抛出KeyError: 0。 - 潜在的前置问题:你当前读取的pickle文件路径为
GAWD/data/injected/rand_injected.pkl,和你前文写入的result/GAWD.pkl并不是同一个文件,需要先确认你读取的pkl文件中存储的数据结构是否符合你的预期。
排查和修复步骤
- 先确认目标pkl文件的存储结构,运行下面的代码打印结构信息:
import networkx as nx with open("GAWD/data/injected/rand_injected.pkl", 'rb') as handle: loaded_data = pickle.load(handle) # 打印加载后的数据类型 print(type(loaded_data)) # 如果是列表,打印列表长度 if isinstance(loaded_data, list): print(len(loaded_data)) # 打印第一个元素的类型 first_item = loaded_data[0] print(type(first_item)) # 如果是networkx图,打印所有节点ID if isinstance(first_item, nx.Graph): print("图的节点ID列表:", list(first_item.nodes))
- 根据实际结构调整代码:
- 如果加载的
loaded_data本身就是图对象的列表,要把所有图存入numpy数组的话,直接去掉[0]即可:
with open("GAWD/data/injected/rand_injected.pkl", 'rb') as handle: data = np.array(pickle.load(handle), dtype=object)- 如果pkl中存储的每个元素是
(图对象, 标签/其他属性)的元组,确认元组的索引规则后再取值即可。
- 如果加载的
内容的提问来源于stack exchange,提问作者B89
相关产品推荐
相关产品推荐

