使用NetworkX将NumPy值写入GEXF时的KeyError

时间:2014-02-26 09:41:55

标签: python numpy networkx

大家好我想计算节点坐标,然后将图形导出到GEXF并用Gephi进行处理。但是当我运行以下代码时

import networkx as nx
import numpy as np
....
area_ratios = [np.sum(new[:,0])/Stotal, np.sum(new[:,1])/Stotal, np.sum(new[:,2])/Stotal]
X = np.array([0, -sqrt(3)/2 * area_ratios[1] , sqrt(3)/2 * area_ratios[2]])
Y = np.array([ area_ratios[0], -1/2 * area_ratios[1] , -1/2 * area_ratios[2]])

point = (np.sum(X), np.sum(Y))

graph.add_node(node_name, {'x-coord': np.asscalar(point[0]*SCALE_FACTOR),         
          'y-coord': np.asscalar(point[1]*SCALE_FACTOR), 'size': Stotal*3})

nx.write_gexf(graph, PATH + 'mygraph.gexf')

它给了我一个KeyError: <type 'numpy.float64'>,即使np.asscalar用于将相关属性转换为兼容的python类型。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

看起来很久以前就解决了这个问题但是我发现我的代码在使用pandas数据框中的浮点值时遇到了类似的问题。解决方案在评论中,但我花了一段时间来弄清楚,所以我想我可能会澄清。

如果您从这样的数据框制作节点:

G.add_node(df2.loc[row,door_col],
                attr_dict={'dropoff':df2.loc[row,'A'],
                            'pageLoadTime':df2.loc[row,'B'],
                            'pageviews':df2.loc[row,'C'],
                            'sessions':df2.loc[row,'D'],
                            'entrances':df2.loc[row,'E'],
                            'exits':df2.loc[row,'F'],
                            'timeOnPage':df2.loc[row,'G'],
                            'classesB':df2.loc[row,'H']}) 

假设cols a-g是浮点数,它们是np.float64值,而不是浮点值。 nx.write_gexf()会崩溃。然而,简单的解决方法是使用以下内容将它们强制转换为简单的值:

G.add_node(df2.loc[row,door_col],
                attr_dict={'dropoff':float(df2.loc[row,'A']),
                            'pageLoadTime':float(df2.loc[row,'B']),
                            'pageviews':float(df2.loc[row,'C']),
                            'sessions':float(df2.loc[row,'D']),
                            'entrances':float(df2.loc[row,'E']),
                            'exits':float(df2.loc[row,'F']),
                            'timeOnPage':float(df2.loc[row,'G']),
                            'classesB':str(df2.loc[row,'H'])}) 

有很多工具都在使用np.float64类型。转换它们总是很容易的选择。