从Shapefile获取Adjacency矩阵

时间:2017-09-13 15:17:10

标签: python matlab networkx shapefile adjacency-matrix

我有一个包含英国电网网络的shapefile的文件夹。 我需要从tese文件中提取此网络的邻接矩阵。 由于我没有使用shapefile,我需要清楚地解释如何获得这样的矩阵。

通过邻接矩阵我指的是一个平方矩阵,其维数与网络节点的数量一样多,并且在单元格中为零,指的是两个未连接的节点,并且在单元格中有一个指向连接的两个节点。我需要这样的Matrix,因为我想在这个网络上测试流行病学系统,这是英国国家电网。

我尝试在Python上运行此代码:

    import networkx as nx
import pickle as serializer
#from osgeo import ogr
#import gdal
#import graphviz as pgv
G=nx.read_shp('NationalGrid-ElecTrans-MT-2012_Nodes.shp')
A = nx.adjacency_matrix(G)
nx.draw(G)
#nx.average_shortest_path_length(G)
#nx.degree(G)
#nx.density(G)
#nx.betweenness_centrality(G)
with open('some_file3.txt', 'w') as f:
    serializer.dump( A, f)

但现在我不知道如何使用我附加的输出。 https://ufile.io/3917f

1 个答案:

答案 0 :(得分:1)

nx.adj_matrix(G)返回SciPy sparse matrix,您可能需要DataFrame或数组。使用nx.convert.to_dict_of_dicts(G)

import pandas as pd
import networkx as nx
G = nx.Graph()
G.add_cycle([1,2,3,4,5])
G.add_cycle([33,3,34,35])
A = pd.DataFrame(nx.convert.to_dict_of_dicts(G)).fillna(0).replace([{}],1)
out: 

    1   2   3   4   5   33  34  35
1   0   1   0   0   1   0   0   0
2   1   0   1   0   0   0   0   0
3   0   1   0   1   0   1   1   0
4   0   0   1   0   1   0   0   0
5   1   0   0   1   0   0   0   0
33  0   0   1   0   0   0   0   1
34  0   0   1   0   0   0   0   1
35  0   0   0   0   0   1   1   0

或更好:

A = nx.convert_matrix.to_pandas_dataframe(K)

如果你需要numpy数组,你可以通过A.values得到值,如果你需要numpy矩阵:

A = nx.convert_matrix.to_numpy_matrix(K)