1

我试图从 a 中获取边缘权重,nx.Graph但我能找出的唯一方法是遍历整个网络。networkx假设我nx.Graph以前没有,有没有更有效的方法来做到这一点pd.DataFrame?这是为了networkx ≥ 2.0.

import pandas as pd
import networkx as nx

# Load iris data
X_iris = pd.read_csv("https://pastebin.com/raw/dR59vTD4", sep="\t", index_col=0)

# Create correlation network
df_corr = X_iris.T.corr()

# Create graph from correlation network
graph_iris = nx.from_pandas_adjacency(df_corr, create_using=nx.Graph)

# Get edge weights
%time edge_weights = pd.Series({tuple(edge_data[:-1]):edge_data[-1]["weight"] for edge_data in graph_iris.edges(data=True)})
edge_weights

# CPU times: user 15.1 ms, sys: 98 µs, total: 15.2 ms
# Wall time: 15.2 ms
# iris_1    iris_0      0.995999
#           iris_2      0.996607
#           iris_3      0.997397
#           iris_4      0.992233
#           iris_5      0.993592
#                         ...   
# iris_146  iris_148    0.988469
#           iris_149    0.986481
# iris_147  iris_148    0.995708
#           iris_149    0.994460
# iris_148  iris_149    0.999916
# Length: 11175, dtype: float64
4

1 回答 1

2

真的没有比这更高效的方法了。由于图的底层数据结构是字典,而权重只是其中的嵌套字典,因此您需要遍历边缘数据以获取权重。有nx.get_edge_attributes,虽然你不会看到性能上的提升,因为它基本上是一样的(参见源代码):

def get_edge_attributes(G, name):
    # ...
    edges = G.edges(data=True)
    return dict( (x[:-1], x[-1][name]) for x in edges if name in x[-1] )
于 2020-06-24T23:00:45.050 回答