Numpy转换Networkx图为数组异常:同节点数图被错误转换
解决方案:保留Networkx图对象的Numpy数组创建方法
问题本质
当列表中所有Networkx DiGraph对象的节点数相同时,即便指定了dtype=object,Numpy仍会调用DiGraph的__array__方法将其转换为节点数组,进而把整个列表转为二维数值数组,导致图对象和边信息丢失。这是因为Numpy在推断数组结构时,若所有元素转换后的数组形状一致,会优先生成数值数组而非对象数组。
解决办法
方法1:先创建空的object数组再逐个赋值
通过预先创建指定长度和类型的空数组,手动添加图对象,避免Numpy自动进行类型推断:
import numpy as np import networkx as nx g1 = nx.DiGraph([(1, 2), (2, 3)]) g3 = nx.DiGraph([(1, 2), (2, 1), (1, 3)]) # 创建空的object类型一维数组 ko_numpy = np.empty(2, dtype=object) # 逐个赋值图对象 ko_numpy[0] = g1 ko_numpy[1] = g3 # 验证结果 print(ko_numpy) # 输出:[<networkx.classes.digraph.DiGraph object at ...>, <networkx.classes.digraph.DiGraph object at ...>] print(type(ko_numpy[0])) # 输出:<class 'networkx.classes.digraph.DiGraph'>
方法2:使用np.fromiter创建对象数组
np.fromiter会逐个迭代输入元素并直接存储为对象,不会触发自动的数组转换:
import numpy as np import networkx as nx g1 = nx.DiGraph([(1, 2), (2, 3)]) g3 = nx.DiGraph([(1, 2), (2, 1), (1, 3)]) # 从迭代器创建object类型数组 ko_numpy = np.fromiter([g1, g3], dtype=object) # 验证结果 print(ko_numpy) # 输出:[<networkx.classes.digraph.DiGraph object at ...>, <networkx.classes.digraph.DiGraph object at ...>] print(ko_numpy.shape) # 输出:(2,)
两种方法都能确保ko_numpy保持一维数组结构,每个元素都是完整的DiGraph对象,边信息完全保留,与ok_numpy表现一致。
内容的提问来源于stack exchange,提问作者Caquot Léonard
相关产品推荐
相关产品推荐

