ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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}})
    반응형

    댓글

Designed by Tistory.