networkxを使ってグラフを表現する
目的
Pythonのライブラリ「networkx」を使ってみる。
今回は簡単な二分グラフを表現する。
Google Colab上で、ライブラリのインストール、グラフの描画、検索までおこなう。
エッジに重みを付けたり、最短経路問題を解いたりはしない。
インストール
pip install networkx matplotlib
matplotlibはグラフを描画するために使用する。
プログラムはGoogle Colaboratoryで実行する。
サンプルコード
グラフの表現と描画
今回は「ファッションアイテム」と「コーディネート」の関係を表現する。(つまりノードは「ファッションアイテム」と「コーディネート」である)
あるファッションアイテムは複数のコーディネートに含まれる。また、あるコーディネートは複数のファッションアイテムで構成されている。
アイテム及びコーディネートはIDで表現している。
code:python
import networkx as nx
import matplotlib.pyplot as plt
# コーディネートIDのリスト
# アイテムIDのリスト
# コーディネートとアイテムの関係
edges = [
('1000001', '2000001'),
('1000001', '2000002'),
('1000002', '2000002'),
('1000002', '2000003'),
('1000003', '2000003'),
('1000003', '2000004')
]
# 二分グラフを作成
B = nx.Graph()
# ノードを追加(属性を付加して二分グラフであることを示す)
B.add_nodes_from(coordinates, bipartite=0)
B.add_nodes_from(items, bipartite=1)
# エッジを追加
B.add_edges_from(edges)
# 二分グラフの描画
pos = {}
pos.update((node, (1, index)) for index, node in enumerate(coordinates)) # x座標を1に設定
pos.update((node, (2, index)) for index, node in enumerate(items)) # x座標を2に設定
nx.draw(B, pos, with_labels=True, node_color=['skyblue' if data'bipartite' == 0 else 'lightgreen' for node, data in B.nodes(data=True)]) plt.show()
出力例
https://scrapbox.io/files/665d9f858c8795001c92abd9.png
検索
あるアイテムを含んでいるコーディネートを検索する。
結果は複数ある場合がある
code:python
# 特定のアイテムを含むコーディネートを出力する関数
def find_coordinates_with_item(item_id):
if item_id not in B:
return f"アイテムID {item_id} はグラフに存在しません。"
# 指定されたアイテムに隣接するノードを取得(コーディネート)
connected_coordinates = [node for node in B.neighbors(item_id) if B.nodesnode'bipartite' == 0] return connected_coordinates
# テスト: アイテム '2000002' を含むコーディネートを取得
item_id = '2000002'
coordinates_with_item = find_coordinates_with_item(item_id)
print(f"アイテム {item_id} を含むコーディネート: {coordinates_with_item}")
出力例
アイテム 2000002 を含むコーディネート: ['1000001', '1000002']