Data & ML & AI/NetworkX
[NetworkX] add_edges_from의 사용방법
뇌님
2022. 10. 14. 20:24
반응형
G.add_edge는 엣지 하나하나를 정의하기엔 편하지만, 한번에 여러개의 엣지를 정의하기엔 불편합니다.
때문에 NetworkX는 add_edges_from과 add_weighted_edges_from을 지원합니다.
각 노드의 속성으로 가중치값만 가지는 weight Graph라면 add_weighted_edges_from을 사용하는 것이 더 편리하겠지만,
2개 이상의 여러 속성들을 가진다면 add_edges_from을 쓰는것이 더 나을 수 있습니다.
그런데 멀티그래프(MultiGraph, 다중그래프)일때와 아닐때 사용방법에 차이가 조금 있습니다.
1. MultiGraph가 아닌 경우 : Graph(), DiGraph()
참조 : Graph.add_edges_from() 공식문서
# 공식문서 중 일부 발췌
Graph.add_edges_from(ebunch_to_add, **attr)
Parameters:
ebunch_to_add : container of edges
Each edge given in the container will be added to the graph.
The edges must be given as 2-tuples (u, v) or 3-tuples (u, v, d) where d is a dictionary containing edge data.
각각의 엣지는 두가지 형태로 명명할 수 있습니다.
- 2-tuples (u, v) : 엣지를 이루는 양쪽의 노드를 사용합니다. ('A','B')와 같은 형태입니다.
- 3-tuples (u, v, d) : 노드 두개 + attribute를 나타내는 딕셔너리를 사용합니다. ('A','B',{'weight':6,'relation':'family'})와 같은 형태입니다.
다음의 예시와 같은 방식으로 엣지를 명명할 수 있습니다.
G = nx.Graph()
# 2-tuples (u,v)
G.add_edges_from([('A','B'),('C','D')])
# 3-tuples (u,v,d)
G.add_edges_from([('E','F',{'weight':6}),('G','H',{'weight':9})])
# 2-tuples + attr
G.add_edges_from([('I','J'),('K','L')], weight=2, relation='family')
# 3-tuples + attr # A-B는 MultiGraph와의 비교를 위해 한번 더 작성했습니다
G.add_edges_from([('M','N',{'weight':3}),('A','B',{'weight':9})], relation='friend')
# 생성결과 확인
G.edges(data=True)
# 출력결과
EdgeDataView([('A', 'B', {'relation': 'friend', 'weight': 9}), ('C', 'D', {}),
('E', 'F', {'weight': 6}), ('G', 'H', {'weight': 9}),
('I', 'J', {'weight': 2, 'relation': 'family'}), ('K', 'L', {'weight': 2, 'relation': 'family'}),
('M', 'N', {'relation': 'friend', 'weight': 3})])
2. MultiGraph인 경우 : MultiGraph(), MultiDiGraph()
참조 : MultiDiGraph.add_edges_from() 공식문서
# 공식문서 중 일부 발췌
MultiDiGraph.add_edges_from(ebunch_to_add, **attr)
Parameters:
ebunch_to_addcontainer of edges
Each edge given in the container will be added to the graph. The edges can be:
2-tuples (u, v) or
3-tuples (u, v, d) for an edge data dict d, or
3-tuples (u, v, k) for not iterable key k, or
4-tuples (u, v, k, d) for an edge with data and key k
1.MultiGraph가 아닌 경우와의 가장 큰 차이점이라면
사용 가능한 방법이 2개 더 추가되었다는 점입니다.
- 3-tuples (u,v,k) : 해당 엣지의 고유 키값 k를 추가합니다. ('유저158','상품312','거래번호120183')과 같은 형태입니다.
- 4-tuples (u,v,k,d) : 거기에 딕셔너리를 추가합니다. ('유저158','상품312','거래번호120183', {'별점':5})와 같은 형태입니다.
다음의 예시와 같은 방식으로 엣지를 명명할 수 있습니다. (**attr은 생략합니다)
G = nx.MultiDiGraph()
# 2-tuples (u,v)
G.add_edges_from([('A','B'),('C','D')])
# 3-tuples (u,v,d)
G.add_edges_from([('E','F',{'weight':6}),('G','H',{'weight':9})])
# 3-tuples (u,v,k)
G.add_edges_from([('I','J','짝사랑'),('K','L','고소')])
# 4-tuples + (u,v,k,d)
G.add_edges_from([('M','N','일방적질투',{'weight':3}),('A','B','짝사랑',{'weight':9})], relation='friend')
# 생성결과 확인
G.edges(data=True)
# 출력결과
OutMultiEdgeDataView([('A', 'B', {}), ('A', 'B', {'relation': 'friend', 'weight': 9}), ('C', 'D', {}),
('E', 'F', {'weight': 6}), ('G', 'H', {'weight': 9}),
('I', 'J', {}), ('K', 'L', {}),
('M', 'N', {'relation': 'friend', 'weight': 3})])
# 상세결과 확인
G['A']['B']
# 출력결과
AtlasView({0: {}, '짝사랑': {'relation': 'friend', 'weight': 9}})
반응형