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

Yan*_* P. 5 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')
Run Code Online (Sandbox Code Playgroud)

它给了我一个KeyError: <type 'numpy.float64'>尽管np.asscalar意味着将相关属性转换为兼容的python类型.

有任何想法吗?

bil*_*anH 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']}) 
Run Code Online (Sandbox Code Playgroud)

假设cols ag是浮点数,它们是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'])}) 
Run Code Online (Sandbox Code Playgroud)

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