-
[NetworkX] add_edges_from의 사용방법Data & ML & AI/NetworkX 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}})
반응형'Data & ML & AI > NetworkX' 카테고리의 다른 글
[NetworkX] 양분그래프, Bipartite Graph (파이썬 네트워크 분석 9) (0) 2022.10.22 [NetworkX] 노드에 속성 부여하는 방법 (파이썬 네트워크 분석 8) (0) 2022.10.16 [NetworkX] 멀티그래프 데이터 읽기 (파이썬 네트워크 분석 7) (0) 2022.10.12 [NetworkX] 그래프 데이터 읽기 (파이썬 네트워크 분석 6) (1) 2022.10.11 [NetworkX] 그래프 종류 종합정리 (파이썬 네트워크 분석 5) (0) 2022.10.09