원시 가장자리 목록에서 인접 행렬까지 Python의 그래프 데이터 처리에 대한 완벽한 가이드

이 기사 는 Lemony Hug가 Huawei 클라우드 커뮤니티에서 공유한 " 원래 Edge 목록에서 인접 매트릭스까지 Python에서 그래프 데이터 처리를 구현하기 위한 전체 가이드 "입니다.

그래프 이론과 네트워크 분석에서 그래프는 노드(또는 정점)와 이를 연결하는 간선으로 구성된 매우 중요한 데이터 구조입니다. Python에서는 인접 행렬을 사용하여 그래프를 표현할 수 있는데, 행렬의 행과 열은 노드를 나타내고, 행렬의 값은 노드 사이에 간선이 있는지 여부를 나타냅니다.

원본 가장자리 목록

각 요소가 모서리를 나타내는 기본 모서리 목록이 있다고 가정합니다. 예를 들면 다음과 같습니다.

모서리 = [(0, 1), (0, 2), (1, 2), (2, 3)]

이 예에서 각 튜플은 node 와 node 사이의 간선 존재를 나타냅니다 . (a, b)  a  b 

인접 행렬로 변환

먼저 그래프의 노드 수를 결정한 다음 해당 크기의 영행렬을 만들어야 합니다. 다음으로 원래 가장자리 목록을 순회하고 각 가장자리의 두 노드를 기반으로 해당 행렬 요소를 1로 설정합니다. 얻은 최종 행렬은 우리에게 필요한 인접 행렬입니다.

Python 코드에서 이 프로세스를 구현하는 방법을 살펴보겠습니다.

def edge_to_adjacency_matrix(가장자리):
    # 그래프에서 노드 수를 찾습니다.
    max_node = max(가장자리의 가장자리에 대한 max(edge)) + 1
    
    #제로 행렬 생성
    adjacency_matrix = [[0] * 범위 내 _에 대한 max_node(max_node)]
    
    # 원래 가장자리 목록을 탐색하고 인접 행렬을 업데이트합니다.
    가장자리의 가장자리:
        adjacency_matrix[가장자리[0]][가장자리[1]] = 1
        adjacency_matrix[edge[1]][edge[0]] = 1 # 무방향 그래프인 경우 간선은 양방향입니다.
    
    adjacency_matrix 반환

# 시험
모서리 = [(0, 1), (0, 2), (1, 2), (2, 3)]
adjacency_matrix = edge_to_adjacency_matrix(가장자리)
adjacency_matrix의 행에 대해:
    인쇄(행)

이 코드에서 edges_to_adjacency_matrix 함수는 원래 가장자리 목록을 인수로 받아들이고 해당 인접 행렬을 반환합니다. 그런 다음 주어진 가장자리 목록에 대해 테스트를 수행하고 결과 인접 행렬을 출력했습니다.

확장 및 최적화

위의 코드는 원본 가장자리 목록을 인접 행렬로 변환하는 작업을 완료할 수 있지만 실제 응용 프로그램에서는 일부 확장 및 최적화가 필요할 수 있습니다.

  1. 유향 및 무향 그래프 처리 : 현재 코드는 기본적으로 무향 그래프를 처리합니다. 유향 그래프인 경우 특정 요구에 따라 코드를 수정해야 하며 인접 관계는 한 방향으로만 설정됩니다.

  2. 가중치 처리 : 때로는 가장자리가 단순히 존재 여부의 관계가 아니라 가중치를 가질 수도 있습니다. 가중치 그래프를 지원하도록 코드가 수정되었습니다.

  3. 희소 행렬 사용 : 큰 그래프의 경우 인접 행렬이 많은 메모리를 차지할 수 있습니다. 희소 행렬을 사용하여 메모리 공간을 절약하는 것이 좋습니다.

  4. 성능 최적화 : 대규모 에지 목록의 경우 코드 성능을 고려해야 합니다. 변환 프로세스를 구현하기 위해 보다 효율적인 데이터 구조나 알고리즘을 사용해 볼 수 있습니다.

다음은 코드 최적화의 몇 가지 예입니다.

numpy를 np로 가져오기

def edge_to_adjacency_matrix(edges, direct=False):
    max_node = max(가장자리의 가장자리에 대한 max(edge)) + 1
    adjacency_matrix = np.zeros((max_node, max_node))
    가장자리의 가장자리:
        지시하는 경우:
            adjacency_matrix[가장자리[0]][가장자리[1]] = 1
        또 다른:
            adjacency_matrix[가장자리[0]][가장자리[1]] = 1
            adjacency_matrix[가장자리[1]][가장자리[0]] = 1
    adjacency_matrix 반환

# 시험
모서리 = [(0, 1), (0, 2), (1, 2), (2, 3)]
adjacency_matrix = edge_to_adjacency_matrix(가장자리)
print("무방향 그래프의 인접 행렬:")
인쇄(인접_행렬)

direct_edges = [(0, 1), (0, 2), (1, 2), (2, 3)]
direct_adjacency_matrix = edge_to_adjacency_matrix(directed_edges, direct=True)
print("\n유향 그래프의 인접 행렬:")
인쇄(directed_adjacency_matrix)

최적화된 코드에서는 NumPy 라이브러리를 사용하여 행렬을 생성하고 조작하여 코드의 성능과 가독성을 향상시킬 수 있습니다. 동시에 유방향 그래프와 무방향 그래프의 변환을 지원하기 위해 그래프 유형을 나타내는 매개변수를 추가했습니다. directed 

희소 행렬을 사용하여 메모리 공간 최적화

큰 그래프를 처리할 때 인접 행렬은 대부분의 요소가 0이 되어 매우 희박해질 수 있습니다. 메모리 사용을 최적화하기 위해 희소 행렬을 사용하여 인접 관계를 나타낼 수 있습니다.

Python에는 희소 행렬을 처리할 수 있는 다양한 라이브러리가 있으며, 그 중 Scipy 라이브러리는 희소 행렬에 대한 다양한 연산과 알고리즘을 제공합니다. Scipy에서 희소 행렬을 사용하여 코드를 최적화하는 방법을 살펴보겠습니다.

numpy를 np로 가져오기
scipy.sparse에서 lil_matrix 가져오기

def edge_to_adjacency_matrix(edges, direct=False):
    max_node = max(가장자리의 가장자리에 대한 max(edge)) + 1
    adjacency_matrix = lil_matrix((max_node, max_node), dtype=np.int8)
    가장자리의 가장자리:
        지시하는 경우:
            adjacency_matrix[가장자리[0], 가장자리[1]] = 1
        또 다른:
            adjacency_matrix[가장자리[0], 가장자리[1]] = 1
            adjacency_matrix[가장자리[1], 가장자리[0]] = 1
    adjacency_matrix 반환

# 시험
모서리 = [(0, 1), (0, 2), (1, 2), (2, 3)]
adjacency_matrix = edge_to_adjacency_matrix(가장자리)
print("무방향 그래프의 인접 행렬:")
인쇄(adjacency_matrix.toarray())

direct_edges = [(0, 1), (0, 2), (1, 2), (2, 3)]
direct_adjacency_matrix = edge_to_adjacency_matrix(directed_edges, direct=True)
print("\n유향 그래프의 인접 행렬:")
인쇄(directed_adjacency_matrix.toarray())

이 버전의 코드에서는 희소 행렬을 만드는 데 사용됩니다. 큰 희소 행렬을 효율적으로 처리할 수 있으며 0이 아닌 요소만 저장하므로 메모리가 절약됩니다. scipy.sparse.lil_matrix 

이러한 최적화를 통해 과도한 메모리 사용으로 인한 성능 저하나 메모리 부족 문제 없이 더 큰 그래프 데이터를 처리할 수 있습니다.

프로세스 가중치 간선 목록

어떤 경우에는 그래프의 모서리가 노드 간의 연결 관계를 나타낼 뿐만 아니라 가중치 정보도 가질 수 있습니다. 예를 들어 교통망에서 모서리는 도로를 나타낼 수 있고, 가중치는 도로의 길이나 이동 시간을 나타낼 수 있습니다.

가중치 간선 목록을 지원하도록 코드를 수정하는 방법을 살펴보겠습니다.

numpy를 np로 가져오기
scipy.sparse에서 lil_matrix 가져오기

def edge_to_adjacency_matrix(edges, direct=False, Weighted=False):
    max_node = max(max(edge[0], edge[1]) for edge in edge) + 1
    adjacency_matrix = lil_matrix((max_node, max_node), dtype=np.float32)
    가장자리의 가장자리:
        지시하는 경우:
            가중치가 부여된 경우:
                adjacency_matrix[가장자리[0], 가장자리[1]] = 가장자리[2]
            또 다른:
                adjacency_matrix[가장자리[0], 가장자리[1]] = 1
        또 다른:
            가중치가 부여된 경우:
                adjacency_matrix[가장자리[0], 가장자리[1]] = 가장자리[2]
                adjacency_matrix[가장자리[1], 가장자리[0]] = 가장자리[2]
            또 다른:
                adjacency_matrix[가장자리[0], 가장자리[1]] = 1
                adjacency_matrix[가장자리[1], 가장자리[0]] = 1
    adjacency_matrix 반환

# 시험
Weighted_edges = [(0, 1, 5), (0, 2, 3), (1, 2, 2), (2, 3, 7)]
Weighted_adjacency_matrix = edge_to_adjacency_matrix(weighted_edges, 가중치=True)
print("가중 인접 행렬:")
인쇄(weighted_adjacency_matrix.toarray())

이 버전의 코드에서는 가장자리에 가중치가 부여되었는지 여부를 나타내는 매개변수를 추가했습니다. 인수가 이면 간선 목록에서 가중치 정보가 추출되어 인접 행렬에 저장됩니다. 그렇지 않으면 인접 행렬의 값은 여전히 ​​가장자리의 존재 여부를 나타냅니다. weighted  weighted  True

이러한 수정을 통해 가중치 정보가 포함된 그래프 데이터를 처리하고 후속 분석 및 계산을 위해 인접 행렬에 이 정보를 유지할 수 있습니다.

그래프 시각화

그래프 데이터를 다룰 때 시각화는 그래프의 구조와 특성을 직관적으로 이해하는 데 도움을 주는 강력한 도구입니다. Python에는 그래프 데이터를 시각화하는 데 사용할 수 있는 많은 라이브러리가 있으며, 그중 NetworkX는 그래프를 생성, 조작 및 시각화하는 풍부한 기능을 제공하는 일반적으로 사용되는 라이브러리입니다.

NetworkX를 사용하여 생성된 인접 행렬을 시각화하는 방법을 살펴보겠습니다.

networkx를 nx로 가져오기
matplotlib.pyplot을 plt로 가져오기

def 시각화_adjacency_matrix(adjacency_matrix):
    G = nx.from_numpy_matrix(adjacency_matrix)
    pos = nx.spring_layout(G) # 노드 위치 정의
    nx.draw(G, pos, with_labels=True, node_color='skyblue', node_size=500,font_size=10) # 绘제화
    edge_labels = {(i, j): w['weight'] for i, j, w in G.edges(data=True)} # 간선 가중치를 얻습니다.
    nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels,font_size=10) # 가장자리 가중치 그리기
    plt.title("그래프 시각화")
    plt.show()

# 시험
Weighted_edges = [(0, 1, 5), (0, 2, 3), (1, 2, 2), (2, 3, 7)]
Weighted_adjacency_matrix = edge_to_adjacency_matrix(weighted_edges, 가중치=True)
print("가중 인접 행렬:")
인쇄(weighted_adjacency_matrix.toarray())

시각화_adjacency_matrix(weighted_adjacency_matrix.toarray())

이 코드에서는 먼저 NetworkX의 기능을 사용하여 인접 행렬을 그래프 개체로 변환합니다. 그런 다음 정의된 노드의 위치를 ​​이용 하고 함수를 이용하여 그래프를 그립니다. 마지막으로 함수를 사용하여 간선 가중치를 플로팅합니다. from_numpy_matrix  spring_layout  draw  draw_networkx_edge_labels 

시각화를 통해 그래프의 구조를 명확하게 볼 수 있고, 노드 간의 연결 관계와 가중치 정보를 직관적으로 이해할 수 있습니다.

인접 행렬을 원시 가장자리 목록으로 변환

그래프 데이터 처리에서 인접 행렬을 원래의 가장자리 목록 형식으로 다시 변환해야 하는 경우가 있습니다. 일부 알고리즘은 그래프를 표현하기 위해 간선 목록을 사용하는 데 더 적합할 수 있으므로 이는 특정 알고리즘 및 응용 프로그램에서 유용할 수 있습니다.

이 변환을 달성하기 위한 코드를 작성하는 방법을 살펴보겠습니다.

numpy를 np로 가져오기

def adjacency_matrix_to_edges(adjacency_matrix):
    가장자리 = []
    범위(adjacency_matrix.shape[0])에 있는 i의 경우:
        범위(adjacency_matrix.shape[1])의 j에 대해:
            adjacency_matrix[i, j] != 0인 경우:
                edge.append((i, j, adjacency_matrix[i, j]))
    복귀 가장자리

# 시험
adjacency_matrix = np.array([[0, 1, 0, 0],
                              [1, 0, 1, 0],
                              [0, 1, 0, 1],
                              [0, 0, 1, 0]], dtype=np.float32)
print("원래 인접 행렬:")
인쇄(인접_행렬)

가장자리 = adjacency_matrix_to_edges(adjacency_matrix)
print("\n변환된 가장자리 목록:")
인쇄(가장자리)

이 코드에서는 인접 행렬의 각 요소를 반복하고 요소의 값이 0이 아닌 경우 이를 가장자리 목록의 가장자리로 변환합니다. 가중치가 있는 그래프의 경우 가중치 정보도 간선 목록에 저장됩니다.

이러한 변환과정을 통해 인접행렬로 표현되는 그래프를 에지리스트 형태로 변환할 수 있어 일부 알고리즘의 구현 및 적용이 용이해진다.

요약 및 전망

이 기사에서는 Python을 사용하여 원본 가장자리 목록을 인접 행렬로 변환하는 방법을 소개하고 다양한 시나리오의 요구 사항을 충족하기 위해 일련의 확장 및 최적화를 수행합니다. 우리는 무방향 및 방향 그래프 처리, 가중치 에지 목록 처리, 희소 행렬을 사용하여 메모리 사용 최적화, 그래프 시각화 및 원시 에지 목록으로의 인접 행렬 변환에 이르기까지 그래프 데이터 처리의 여러 측면을 다룹니다.

실제 응용 분야에서 그래프 데이터 처리는 네트워크 분석, 소셜 네트워크, 교통 계획, 생물정보학 및 기타 여러 분야와 관련하여 매우 중요하고 널리 사용되는 분야입니다. 그래프 데이터 처리 기술을 익히면 복잡한 데이터 구조를 더 잘 이해하고 분석하여 실제 문제를 해결하는 데 도움이 될 수 있습니다.

미래에는 데이터의 규모와 복잡성이 계속 증가함에 따라 그래프 데이터 처리 분야는 더 많은 도전과 기회에 직면하게 될 것입니다. 변화하는 요구와 과제를 해결하기 위해 보다 효율적이고 유연하며 기능이 풍부한 도구와 알고리즘이 등장할 것으로 기대할 수 있습니다. 동시에 우리는 그래프 데이터 처리 분야에서 지속적으로 학습하고 탐구하며 능력과 수준을 지속적으로 향상하고 실제 문제 해결에 더 큰 기여를 할 수 있습니다.

이 글이 그래프 데이터 처리를 이해하고 적용하는 데 도움이 되기를 바랍니다. 또한 이 분야를 더 연구하고 탐구하며 데이터 과학 및 엔지니어링 발전에 기여할 수 있기를 바랍니다.

화웨이 클라우드의 신기술에 대해 빨리 알아보고 팔로우하려면 클릭하세요~

 

Google Python Foundation 팀이 해고되었습니다. Google은 해고를 확인했으며 Flutter, Dart 및 Python 관련 팀은 GitHub 핫리스트로 돌진했습니다. 오픈 소스 프로그래밍 언어와 프레임워크가 어떻게 그렇게 귀여울 수 있습니까? Xshell 8 베타 테스트 개시: RDP 프로토콜을 지원하고 Windows 10/11에 원격으로 연결할 수 있습니다. 승객이 고속철 WiFi에 연결하면 중국 코더의 "35세 저주"가 고속으로 연결됩니다. 레일 WiFi MySQL의 첫 번째 장기 지원 버전 8.4 GA AI 검색 도구 Perplexica: 완전히 오픈 소스이며 무료이며 Perplexity의 오픈 소스 대안입니다. Huawei 경영진은 오픈 소스 Hongmeng의 가치를 평가합니다. 지속적인 탄압에도 불구하고 여전히 자체 운영 체제가 있습니다. 독일의 자동차 소프트웨어 회사 Elektrobit는 우분투 기반의 자동차 운영체제 솔루션을 오픈소스화했습니다.
{{o.이름}}
{{이름}}

추천

출처my.oschina.net/u/4526289/blog/11065906