KeyError при записи значений NumPy в GEXF с помощью 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.

Любые идеи?


person Yannis P.    schedule 26.02.2014    source источник
comment
Какой тип Stotal? У меня все работает нормально, когда я пытаюсь использовать np.asscalar для всех трех значений. (или просто определяя Stotal как int)   -  person Bonlenfum    schedule 26.02.2014
comment
Правильно! Я видел это немного после того, как написал пост. Это тоже необходимо преобразовать. Спасибо за ответ   -  person Yannis P.    schedule 26.02.2014
comment
Не могли бы вы принять ответ, чтобы пометить вопрос как решенный, даже если это произойдет пять лет спустя?   -  person MERose    schedule 22.02.2019


Ответы (1)


Похоже, это было решено давно, но я обнаружил, что у моего кода была аналогичная проблема с использованием значений с плавающей запятой из фрейма данных 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']}) 

Предполагая, что столбцы 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. Конвертировать их всегда проще простого.

person billmanH    schedule 20.11.2015