Создание матрицы смежности для больших идентификационных номеров

#python #networkx #openstreetmap #adjacency-matrix

#python #networkx #openstreetmap #матрица смежности

Вопрос:

Я извлек некоторые дорожные данные из Openstreetmap отношения между перекрестком, представленным в a node , и у каждого node есть an id , извлеченные данные были преобразованы в фрейм данных формы (50,2) , поскольку я пытаюсь реализовать на земле небольшого размера

Фрейм данных выглядит следующим образом

     id_1        id_2
0     42807002  8219742091
1   8219742091  8219737904
2   8219737904    42807004
3     42839143  8219742075
4   8219742075    42807002
5     42807002    42839146
6     42839146    42839155
7     42839155    42839161
8     42839161    42839168
9     42839168  2875111804
10  2875111804    42839172
11    42839146  8219742083
12  8219742083  8219742024
13  8219742024    42845825
14    42839161  8219742048
15  8219742048  8219742063
16  8219742063    42862789
17    42839155  8219742066
18  8219742066  5427796641
19  5427796641  5427796639
20  5427796639  5427796630 
 

и для дополнительной иллюстрации это графическое отношение между моими узлами.

введите описание изображения здесь

Каждая запись показывает, что существует связь между id_1 и id_2.

Я хотел бы создать adjacency matrix для этого фрейма данных, но у меня огромная проблема в том, что имена идентификаторов такие большие (наибольшее значение — 8219742092). Я попытался использовать этот код, используя networkx

 G = nx.from_pandas_adjacency(df)
 

но, как я и ожидал, это не работает, поскольку networkx adjacency требуются узлы от 0 до 8219742092, а число 8219742092 настолько велико, что из него можно создать набор данных.

Как я могу создать матрицу смежности на основе этих данных?

Небольшое примечание: я не могу переименовать идентификатор.

Комментарии:

1. По сути, ваш график представляет собой разреженный граф, создание матрицы смежности никогда не является хорошим решением для разреженных графов, вы должны попытаться работать с другими решениями, такими как список смежности или список ребер и т.д. В противном случае вы можете создать словарь, сопоставляющий ваши идентификаторы узлов с небольшими отображенными идентификаторами, а затем работать с вашими отображенными идентификаторами. Это обходной путь, с которым я также работаю в одной из своих проблем. Я надеюсь, что это вам тоже поможет.

2. спасибо, это мне очень помогло

Ответ №1:

попробуйте использовать этот код с помощью перекрестной таблицы

 cross = pd.crosstab(df['id_1'],df['id_2'])
adjacency_matrix=cross.values