Python 为什么networkx的read_edgelist不接受数组/列表作为权重?

Python 为什么networkx的read_edgelist不接受数组/列表作为权重?,python,arrays,types,networkx,Python,Arrays,Types,Networkx,我正在使用Python和networkx包从文件中读取edgelist以构建图形 我的边缘主义者看起来像这样: [(0, 114, {'pts': array([[ 1, 822], [ 1, 821], [ 2, 820], [ 3, 819]], dtype=int16), 'weight': 23.38477631085024}), (1, 110, {'pts': array([[ 1, 3], [ 1, 2],

我正在使用Python和networkx包从文件中读取edgelist以构建图形

我的边缘主义者看起来像这样:

[(0, 114, {'pts': array([[  1, 822],
       [  1, 821],
       [  2, 820],
       [  3, 819]], dtype=int16), 'weight': 23.38477631085024}),
(1, 110, {'pts': array([[ 1,  3],
       [ 1,  2],
       [ 2,  1]], dtype=int16), 'weight': 18.414213562373096})]
我写这个边缘主义者的时候:

nx.write_edgelist(G, 'my_el.edgelist', data=True)
我的边由“开始”和“结束”节点定义,然后是权重。每条边有两个权重。第一个权重是像素坐标数组,第二个权重是浮点

该图由一个带有“sknw”库的骨架构成,使用:

现在我想读入这个边缘列表来构建一个图表。但是,Python不将我的像素坐标数组识别为单个权重元素。 我尝试了
nx.read\u edgelist('my\u el.edgelist',data=True)
,这给了我以下错误:

TypeError: Failed to convert edge data (["{'pts':", 'array([[', '1,', '822],']) to dictionary.
nx.read\u edgelist('my\u el.edgelist',data=['pts','weight']
给了我:

IndexError: Edge data ["{'pts':", 'array([[', '1,', '822],'] and data_keys ['pts', 'weight'] are not the same length
nx.read_edgelist('my_el.edgelist',data=('pts',int),('weight',float'))
给了我

IndexError: Edge data ["{'pts':", 'array([[', '1,', '822],'] and data_keys (('pts', <class 'int'>), ('weight', <class 'float'>)) are not the same length
索引器:边缘数据[“{'pts':”,'array([[”,'1','822],']和数据键(('pts',),('weight',)的长度不同
我假设该函数在数组作为权重或my_el.edgelist文件的格式方面存在问题,但我真的不知道如何在不通过转换为字符串或类似方法的情况下正确解决此问题


如果有人能给我指出正确的方向并帮我解决这个问题,我将不胜感激。

处理numpy数组似乎是networkx的一个主要问题。但是,将图像骨架转换为图形的函数似乎使用了numpy数组。 由于我不希望更改导入的函数,因此在将edgelist写入文件时,似乎可以缓解问题的一个可能的解决方法是更改数组类型,因此:

for (s, e) in G.edges():
    G[s][e]['pts'] = G[s][e]['pts'].tolist()

它可能不是计算效率最高的,也不会解决问题的根源,但可以完成工作,以防任何人遇到类似的问题。

您可以分享一个简单的例子,如何创建边缘列表?您是否可以更改边缘列表的创建?因为可能会有额外的lin与
pts
的中断是您的问题的一部分。您的edgelist格式很复杂,这会使parse_edgelist函数失效。我建议使用普通Python读取edgelist文件。您可以自己一行一行地解析它,并使用权重为每条边创建数据。然后您可以使用read_edgelist或yo创建图形您可以使用
add_edge
@Sparky05使用所有属性逐边创建它,是的,我通常可以更改创建edgelist的方式。但是,创建边的方式是使用另一个包中的内置sknw函数,我希望避免重写导入的函数。但是,指出add传统的换行作为一个问题有帮助,谢谢!谢谢@RamNarasimhan,使用简单的python数组,而不是numpy数组,创造了奇迹!
for (s, e) in G.edges():
    G[s][e]['pts'] = G[s][e]['pts'].tolist()