Координаты вершин в графическом инструменте

Я хотел бы эффективно указать координаты вершин графа в графическом инструменте.

Учитывая csv, который выглядит так:

Node,X,Y

1,2.5,3.8

2,3.4,2.9

...

Я бы хотел, чтобы граф-инструмент отображал вершину 1 в позиции (2.5,3.8) и т.д...

Неэффективное решение приведено в: Явная позиция вершины в python graph-tool , поэтому я могу использовать цикл for для всех своих координат и сохранить их на карте свойств 'pos'. Если мой график равен «g», а мой csv читается с использованием pandas в «координатах» фрейма данных, я могу сделать:

for i in range(1,numnodes+1):
    pos[g.vertex(i)] = (coordinates.values[i-1,1],coordinates.values[i-1,2]) 

Проблема в том, что у меня большое количество узлов, numnodes (~10^7), и это может занять некоторое время.

Есть ли более эффективный способ выполнить эту операцию, введя данные непосредственно в карту свойств 'pos'?


person me47    schedule 26.06.2016    source источник
comment
Можете ли вы попробовать использовать его векторизованным способом: pos = coordinates[['X','Y']].values вместо цикла? Я не знаю модуль graph-tool, но я думаю, что он должен работать с массивами numpy или, может быть, даже с фреймами данных pandas...   -  person MaxU    schedule 27.06.2016


Ответы (2)


Я нашел ответ на свой вопрос, эффективный способ сделать это — использовать функцию .set_2d_array();

pos.set_2d_array(coordinates[['X','Y']].values.T)

делает свое дело. Здесь «.T» — это функция транспонирования, часть библиотеки numpy.

person me47    schedule 28.06.2016

Я бы попробовал это:

pos = coordinates[['X','Y']].values

если graph-tool принимает массивы numpy, иначе:

pos = [tuple(t) for t in coordinates[['X','Y']].values]
person MaxU    schedule 26.06.2016
comment
Спасибо за Ваш ответ ! К сожалению, оба не сработали, я подозреваю, что это потому, что 'pos' теряет свой тип при выполнении этой операции. Например, если я делаю for e в pos: print e, я получаю array([ 2.5, 3.8]) array([ 3.4, 2.9])... - person me47; 27.06.2016