复杂网络作业二:第一题——Wikipedia vote网络的基本分析

本文通过使用NetworkX库对Wikipedia投票网络进行了基本分析,包括节点数、自环节点数等,并介绍了相关函数的用法。


前言

完成了作业的第一题,记录一下 。比较简单主要是为了熟悉networkx的使用。(没有选择SNAP)


一、题目要求

1. Wikipedia vote网络的基本分析:

数据集下载地址:http://snap.stanford.edu/data/wiki-Vote.html使用分析工具加载Wikipedia voting 网络。该网络为有向图。节点集合V,边集E,边(a, b)表示用户a投票给用户b。
计算并打印如下统计结果:
(1)网络中的节点数量
(2)网络有自环的节点数量
(3)网络中有向边的数量
(4)网络中无向边的数量
(5)网络中的互惠边的数量
(6)出度非零的节点数量
(7)入度非零的节点数量
(8)出度大于10的节点数量
(9)入度小于10的节点数量

二、需要使用的函数的介绍

1.导入networkx

import networkx as nx

2.建图DiGraph()

G = nx.DiGraph(edge_list) #edge_list是一个边集

3.获取点集nodes

node_list = G.nodes #node_list中的是所有的点

4.遍历边集edges()

for u, v in G.edges():#在这下面可以加上对应的代码

5.获取由出度构成的图pred

out_degreeG = G.pred #out_deggreeG是由出度构成的图

6.获取由入度构成的图succ

in_degreeG = G.succ#in_deggreeG是由出度构成的图

在第一个题中就使用以上函数就够了,剩下的就是python中的list,dict中的操作了。

三、代码

# -*- coding: utf-8 -*-

import networkx as nx
import argparse
import matplotlib.pyplot as plt


def getEdge(data_path):
    edge_list = []
    with open(data_path,encoding='utf-8') as f:
        line = f.readline()
        while line != "":
            if(line == '\n' or line[0] == '#'):
                line = f.readline()
                continue
            edge = tuple(map(int,line[:-1].split('	')))  #这个不是空格
            edge_list.append(edge)
            line = f.readline()
    return edge_list
def main(option):
    file_path = option.file_path
    #自己写的文件解析,不清楚networkx有没有内置的方法可以直接导入
    edge_list = getEdge(file_path)  
    G = nx.DiGraph(edge_list)
    node_list = G.nodes
    cnt_nodes = len(node_list)
    print("图中的结点数量:", cnt_nodes)
    cnt_self = 0
    for u, v in G.edges():
        if (u == v):
            cnt_self += 1
    print("自环的节点数量:", cnt_self)
    print("有向边的数量:", G.number_of_edges())
    out_degreeG = G.pred
    cnt_undir = 0
    for node in out_degreeG:
        for edge in out_degreeG[node]:
            node_to = edge
            if (node in out_degreeG[node_to]):
                cnt_undir += 1
    print("无向边的数量:", cnt_undir)
    # 互惠边的概念与无向边类似
    print("互惠边的数量:", cnt_undir)
    cnt_out_zero = 0
    for node in out_degreeG:
        if (out_degreeG[node] == {}):
            cnt_out_zero += 1
    print("出度为零的节点数量:", cnt_out_zero)
    in_degreeG = G.succ
    cnt_in_zero = 0
    for node in in_degreeG:
        if (in_degreeG[node] == {}):
            cnt_in_zero += 1
    print("入度为零的节点数量:", cnt_in_zero)
    cnt_out_u10 = 0
    for node in out_degreeG:
        if (len(out_degreeG[node]) > 10):
            cnt_out_u10 += 1
    print("出度大于零的节点数量:", cnt_out_u10)
    cnt_in_l10 = 0
    for node in in_degreeG:
        if (len(in_degreeG[node]) < 10):
            cnt_in_l10 += 1
    print("入度为零的节点数量:", cnt_in_zero)

if __name__ == "__main__":
    arg = argparse.ArgumentParser()
    arg.add_argument("--file_path",type=str,default=r"Wiki-Vote.txt")
    opt = arg.parse_args()
    main(opt)

运行结果

图中的结点数量: 7115
自环的节点数量: 0
有向边的数量: 103689
无向边的数量: 5854
互惠边的数量: 5854
出度为零的节点数量: 4734
入度为零的节点数量: 1005
出度大于零的节点数量: 1906
入度为零的节点数量: 1005

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值