2016-07-25 137 views
0

我有圖的鄰接矩陣如何計算鄰接矩陣的短路徑測地距離csv [python]?

graph

n 1 2 3 4 5 6 7 8 9

1 0 1 1 1 0 0 0 0 0

2 1 0 1 0 0 0 0 0 0

3 1 1 0 1 0 0 0 0 0

4 1 0 1 0 1 1 0 0 0

5 0 0 0 1 0 1 1 1 0

6 0 0 0 1 1 0 1 1 0

7 0 0 0 0 1 1 0 1 1

8 0 0 0 0 1 1 1 0 0

9 0 0 0 0 0 0 1 0 0

如何將其轉換爲測地使用python discance矩陣?

我的目標是讓這樣的:

n 1 2 3 4 5 6 7 8 9

1 0 1 1 1 2 2 3 3 4

2 1 0 1 2 3 3 4 4 5

3 1 1 0 1 2 2 3 3 4

4 1 2 1 0 1 1 2 2 3

5 2 3 2 1 0 1 1 1 2

6 2 3 2 1 1 0 1 1 2

7 3 4 3 2 1 1 0 1 1

8 3 4 3 2 1 1 1 0 2

9 4 5 4 3 2 2 1 2 0

我試過在networkx一些代碼,但它只能在一個源和(n),而不是整個矩陣的一個目的地計算。我真的需要你的幫助。 謝謝

回答

0

networkx可以計算整個矩陣。一個不需要給nx.shortest_path函數提供源或目標(參見https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.algorithms.shortest_paths.generic.shortest_path.html - 最後一個例子)。這裏是我的解決方案:

import pprint 
import networkx as nx 
import pandas as pd 
import numpy as np 
mat = pd.read_csv('adjacency.csv', index_col=0, delim_whitespace=True).values 
G = nx.from_numpy_matrix(mat) 
p = nx.shortest_path(G) 
shortest_path_mat = np.zeros(mat.shape) 
for i in range(mat.shape[0]): 
    shortest_path_mat[i, :] = np.array([len(x) for x in p[i].values()]) 
pprint.pprint(shortest_path_mat-1) 

adjacency.csv

n 1 2 3 4 5 6 7 8 9 

1 0 1 1 1 0 0 0 0 0 

2 1 0 1 0 0 0 0 0 0 

3 1 1 0 1 0 0 0 0 0 

4 1 0 1 0 1 1 0 0 0 

5 0 0 0 1 0 1 1 1 0 

6 0 0 0 1 1 0 1 1 0 

7 0 0 0 0 1 1 0 1 1 

8 0 0 0 0 1 1 1 0 0 

9 0 0 0 0 0 0 1 0 0 
+0

我已經安裝了networkx,熊貓,numpy的,但仍然錯誤 – kikiegoguma

+0

'文件「C:\用戶\ kikiegoguma \蟒蛇\ LIB \站點包\ networkx \ convert_matrix.py「,第487行,來自from_numpy_matrix 」nx,ny =%s「%(A.shape,)) networkx.exception.NetworkXError :('Adjacency matrix is not square。','nx, ny =(9,0)')' – kikiegoguma

+0

你的'csv'文件可能有問題。請在每行值之間加空行。你不能從這裏複製粘貼。 –