Pynote

Python、機械学習、画像処理について

グラフ理論 - networkx で点、辺を参照する方法について

点を参照する関数、属性一覧

関数名 free functions Graph DiGraph MultiGraph MultiDiGraph
nodes
__iter__
get_node_attributes
set_node_attributes
has_node
__contains__

import networkx as nx

G = nx.Graph()
n = [(1, {'size': 3}), (2, {'size': 5}), 3]
G.add_nodes_from(n)

nodes: 点の一覧を取得する。

G.nodes または G.nodes() で点の一覧を表すオブジェクト (NodeView) を取得できる。

print(type(G.nodes))  # <class 'networkx.classes.reportviews.NodeView'>
print(type(G.nodes()))  # <class 'networkx.classes.reportviews.NodeView'>
nodes(data=True)

属性付きで点の一覧を取得する。

print(G.nodes(data=True))  # [(1, {'size': 3}), (2, {'size': 5}), (3, {})]
nodes(data=False)

属性なしで点の一覧を取得する。

print(G.nodes(data=False))  # [1, 2, 3]
nodes(data=<属性名>)

点及び指定した属性の値の一覧を取得する。
指定した属性がない点の属性値は None になっている。

# 返り値は [(点, 属性値), (点, 属性値), ...]
print(G.nodes(data='size'))  # [(1, 3), (2, 5), (3, None)]
nodes(default=<デフォルトの属性値>)

default 引数で指定した属性がない点はデフォルト値を代わりに使用する。

print(G.nodes(data='size', default=1))  # [(1, 3), (2, 5), (3, 1)]
添字のアクセス

NodeView は subscriptable のため、指定した点の属性を添字で取得できる。

print(type(G.nodes[1]))  # <class 'dict'>
print(G.nodes[1])  # {'size': 3}

属性は辞書なので、次のように属性値を取得できる。

print(G.nodes[1]['size'])  # 3

__iter__: 点の一覧を返すイテレータ

グラフオブジェクトは iterable で各点を返す。

for n in G:
    print(n, end=' ')  # 1 2 3 

print(list(G.nodes))  # [1, 2, 3]

get_node_attributes: 指定した属性を持つ点及び属性値の一覧を取得する。

import networkx as nx

G = nx.Graph()
n = [(1, {'size': 3}), (2, {'size': 5}), 3]
G.add_nodes_from(n)

# 返り値は {点, 属性値, 点:属性値, ...}
sizes = nx.get_node_attributes(G, 'size')
print(sizes)  # {1: 3, 2: 5}

has_node: 指定した点が存在するかどうかを判定する。

print(G.has_node(1))  # True
print(G.has_node(4))  # False

__contains__: 指定した点が存在するかどうかを判定する。

print(1 in G)  # True
print(4 in G)  # False

辺を参照する関数、属性一覧

関数名 free functions Graph DiGraph MultiGraph MultiDiGraph
edges
in_edges
out_edges
get_edge_attributes
set_edge_attributes
get_edge_data
has_edge

G = nx.Graph()
e = [(1, 2, {'weight': 3}), (2, 3, {'weight': 5}), (1, 3)]
G.add_edges_from(e)

edges: 辺の一覧を取得する。

G.edges または G.edges() で辺の一覧を表すオブジェクト (EdgeView) を取得できる。

print(type(G.edges))  # <class 'networkx.classes.reportviews.EdgeView'>
print(type(G.edges()))  # <class 'networkx.classes.reportviews.EdgeView'>
edges(data=True)

属性付きで辺の一覧を取得する。

print(G.edges(data=True))  # [(1, 2, {'weight': 3}), (1, 3, {}), (2, 3, {'weight': 5})]
edges(data=False)

属性なしで辺の一覧を取得する。

print(G.edges(data=False))  # [(1, 2), (1, 3), (2, 3)]
edges(data=<属性名>)

辺及び指定した属性の値の一覧を取得する。
指定した属性がない辺の属性値は None になっている。

# 返り値は [(点, 点, 指定した属性値), (点, 点, 指定した属性値), ...]
print(G.edges(data='weight'))  # [(1, 2, 3), (1, 3, None), (2, 3, 5)]
edges(default=<デフォルトの属性値>)

default 引数で指定した属性がない辺はデフォルト値を代わりに使用する。

print(G.edges(data='weight', default=1))  # [(1, 3), (2, 5), (3, 1)]
添字のアクセス

EdgeView は subscriptable のため、指定した辺の属性を添字で取得できる。

print(G.edges[1, 2])  # {'weight': 3}
print(G.edges(1, 2))  # {'weight': 3}

属性は辞書なので、次のように属性値を取得できる。

print(G.edges[1, 2]['weight'])  # 3
edges(<点>)

指定した点に接続する辺を取得する。

print(G.edges(1))  # [(1, 2), (1, 3)]

in_edges, out_edges: 入ってくる辺、出ていく辺の一覧を取得する。

有向グラフで指定した点に入ってくる辺、出ていく辺の一覧を取得する。
関数の使い方は edges と同じである。

import networkx as nx

G = nx.DiGraph([(1, 2), (1, 2), (1, 3), (2, 3), (2, 4)])
draw_graph(G)

print(G.in_edges(2))  # [(1, 2)]
print(G.out_edges(2))  # [(2, 3), (2, 4)]


get_node_attributes: 指定した属性を持つ辺及び属性値の一覧を取得する。

G = nx.Graph()
e = [(1, 2, {'weight': 3}), (2, 3, {'weight': 5}), (1, 3)]
G.add_edges_from(e)

# 返り値は {辺: 属性値, 辺: 属性値, ...}
print(nx.get_edge_attributes(G, 'weight'))  # {(1, 2): 3, (2, 3): 5}

get_edge_data: 指定した辺の属性を取得する。

default を指定していない場合、辺が存在しないと None を返す。
default を指定している場合、辺が存在しないと default で指定した値を返す。

G = nx.Graph()
e = [(1, 2, {'weight': 3}), (2, 3, {'weight': 5}), (1, 3)]
G.add_edges_from(e)

print(G.get_edge_data(1, 2))  # {'weight': 3}
# 辺 (1, 4) は存在しない
print(G.get_edge_data(1, 4))  # None
print(G.get_edge_data(1, 4, default=1))  # 1

has_edge: 指定した辺が存在するかどうかを判定する。

print(G.has_edge(1, 2))  # True
print(G.has_edge(1, 4))  # False

辺の数、点の数を取得する関数一覧

関数名 free functions Graph DiGraph MultiGraph MultiDiGraph
number_of_nodes
order
__len__
number_of_edges
size

点の数を取得する。

e = {1: [2, 3],
     2: [3, 4]}
G = nx.Graph(e)

print(G.number_of_nodes())  # 4
print(G.order())  # 4
print(len(G))  # 4

辺の数を取得する。

e = {1: [2, 3],
     2: [3, 4]}
G = nx.Graph(e)

print(G.number_of_edges())  # 4
print(G.size())  # 4

weight 引数に重みの属性名を指定すると、重み付きの位数を取得できる。

print('size', G.size(weight='weight'))  # size 9.0

始点と終点を指定した場合、その2点を結ぶ辺の数を取得できる。

print('size', G.number_of_edges(1, 2))  # size 1

その他

import networkx as nx

G = nx.MultiGraph([(1, 1), (1, 2), (1, 2), (1, 3), (3, 3), (2, 3), (2, 4)])
draw_graph(G)

print('number_of_selfloops', nx.number_of_selfloops(G))  # 2
print('nodes_with_selfloops', list(nx.nodes_with_selfloops(G)))  # [1, 3]
print('non_edges', list(nx.non_edges(G)))  # [(1, 4), (3, 4)]
print('selfloop_edges', list(nx.selfloop_edges(G)))  # [(1, 1), (3, 3)]


次数を取得する関数一覧

関数名 free functions Graph DiGraph MultiGraph MultiDiGraph
degree
in_degree
out_degree

import networkx as nx

G = nx.DiGraph([(1, 2), (1, 2), (1, 3), (2, 3), (2, 4)])
draw_graph(G)

print('degree', G.degree(2))  # degree 3
print('in_degree', G.in_degree(2))  # in_degree 1
print('out_degree', G.out_degree(2))  # out_degree 2