大家好我想计算节点坐标,然后将图形导出到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类型。
有什么想法吗?
答案 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类型。转换它们总是很容易的选择。