如何解决为什么来自networkx的read_edgelist不接受数组/列表作为权重?
我正在使用Python和networkx包从文件中读取边缘列表以构建图形。
我的边缘列表如下:
[(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]],'weight': 18.414213562373096})]
我用以下方法写了这个边沿列表:
nx.write_edgelist(G,'my_el.edgelist',data=True)
我的边缘由开始和结束节点定义,然后,我有了权重。每个边都有两个权重。第一个权重是一个像素坐标数组,第二个权重是一个浮点数。
该图是使用build_sknw function从带有sknw库的骨架构造的:
def build_sknw(ske,multi=False):
buf = buffer(ske)
nbs = neighbors(buf.shape)
acc = np.cumprod((1,)+buf.shape[::-1][:-1])[::-1]
mark(buf,nbs)
pts = np.array(np.where(buf.ravel()==2))[0]
nodes,edges = parse_struc(buf,pts,nbs,acc)
return build_graph(nodes,edges,multi)
现在,我想阅读此边缘列表以构建图形。但是,Python无法将我的像素坐标数组识别为单个权重元素。
我尝试过nx.read_edgelist('my_el.edgelist',data=True)
,这给了我以下错误:
TypeError: Failed to convert edge data (["{'pts':",'array([[','1,','822],']) to dictionary.
nx.read_edgelist('my_el.edgelist',data=['pts','weight']
给我:
IndexError: Edge data ["{'pts':",'] 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':",'] and data_keys (('pts',<class 'int'>),<class 'float'>)) are not the same length
我认为该函数在将数组作为权重或my_el.edgelist文件的格式方面存在问题,但是我真的不知道如何在没有任何变通办法的情况下正确解决此问题,方法是通过转换为字符串或类似的字符串。
如果有人能指出正确的方向并帮助我,我将不胜感激!
解决方法
使用numpy数组处理似乎是networkx的主要问题。但是,将我的图像骨架转换为图形G
的函数似乎正在使用numpy数组。
由于我不想更改导入的函数,因此在将边缘列表写入文件时似乎可以缓解该问题的一种可能的解决方法是更改数组类型:
for (s,e) in G.edges():
G[s][e]['pts'] = G[s][e]['pts'].tolist()
它可能不是计算效率最高的,并且不能解决问题的根源,但是如果有人遇到类似的问题,它将完成任务。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。