2

这应该很简单,但我无法弄清楚。我只需要

  • 将文件中的矩阵读入 Python(该矩阵没有标题/行名)
  • 将其转换为边缘列表
  • 将边缘列表写入文件

我可以分别做这些,但我不知道如何从导入的矩阵到 networkx 模块中的图形对象。如果我能够转换为 networkx 图,那么我可以制作一个边缘列表并写入文件。

要读取的矩阵示例(保存在 .txt 文件中)

1 0 1 0 1
1 0 1 0 0
1 0 1 0 1
0 0 1 0 0
1 1 1 1 0
1 1 1 0 1
1 0 1 0 0
4

4 回答 4

5

这使用 numpy 读取矩阵并将邻接数据转换为边列表。然后它创建一个networkx Graph,并绘制一个图。

import numpy as np
import networkx as nx
import matplotlib.pyplot as plt


# Load the adjacency matrix into a numpy array.
a = np.loadtxt('matrix.txt', dtype=int)

print "a:"
print a

num_nodes = a.shape[0] + a.shape[1]

# Get the row and column coordinates where the array is 1.
rows, cols = np.where(a == 1)

# We label the nodes corresponding to the rows with integers from 0 to
# a.shape[0]-1, and we label the nodes corresponding to the columns with
# integers from a.shape[0] to a.shape[0] + a.shape[1] - 1.
# Rearranges the list of rows and columns into a list of edge tuples.
edges = zip(rows.tolist(), (cols + a.shape[0]).tolist())
print "U nodes:", np.arange(a.shape[0])
print "V nodes:", np.arange(a.shape[1]) + a.shape[0]
print "edges"
print edges

# Create a Graph object (from the networkx library).
b = nx.Graph()
b.add_nodes_from(range(num_nodes))  # This line not strictly necessry.
b.add_edges_from(edges)

# Draw the graph.  First create positions for each node. Put the U nodes
# on the left (x=1) and the V nodes on the right (x=2).
pos = dict([(k, (1, k - 0.5 * a.shape[0]))
            for k in range(a.shape[0])])
pos.update(dict([(k + a.shape[0], (2, k - 0.5 * a.shape[1]))
                  for k in range(a.shape[1])]))
nx.draw_networkx(b, pos=pos, node_color=(['c'] * a.shape[0]) + (['y'] * a.shape[1]))

plt.axis('off')
plt.show()

输出:

a:
[[1 0 1 0 1]
 [1 0 1 0 0]
 [1 0 1 0 1]
 [0 0 1 0 0]
 [1 1 1 1 0]
 [1 1 1 0 1]
 [1 0 1 0 0]]
U nodes: [0 1 2 3 4 5 6]
V nodes: [ 7  8  9 10 11]
edges:
[(0, 7), (0, 9), (0, 11), (1, 7), (1, 9), (2, 7), (2, 9), (2, 11), (3, 9), (4, 7), (4, 8), (4, 9), (4, 10), (5, 7), (5, 8), (5, 9), (5, 11), (6, 7), (6, 9)]

剧情: 二分图

于 2013-03-08T05:17:09.913 回答
3

您不需要 NetworkX 转换为简单的边缘列表:

adj = """1 0 1 0 1
1 0 1 0 0
1 0 1 0 1
0 0 1 0 0
1 1 1 1 0
1 1 1 0 1
1 0 1 0 0"""

for row,line in enumerate(adj.split('\n')):
    for col,val in enumerate(line.split(' ')):
        if val == '1':
            print row,col
于 2013-03-08T04:52:01.823 回答
1
import numpy as np

#read matrix without head.
a = np.loadtxt('admatrix.txt', delimiter=',', dtype=int)  #set the delimiter as you need
print "a:"
print a
print 'shape:',a.shape[0] ,"*", a.shape[1]

num_nodes = a.shape[0] + a.shape[1]

num_edge = 0
edgeSet = set()

for row in range(a.shape[0]):
    for column in range(a.shape[1]):
        if a.item(row,column) == 1 and (column,row) not in edgeSet: #get rid of repeat edge
            num_edge += 1
            edgeSet.add((row,column))

print '\nnum_edge:', num_edge
print 'edge Set:', edgeSet
print ''
for edge in edgeSet:
    print edge[0] , edge[1]

此代码将读取以逗号分隔的邻接矩阵文件,并打印输出边缘列表。

例如,adj-matrix.txt 是:

0, 1, 0, 1
1, 0, 1, 0
0, 1, 0, 0
1, 0, 0, 0

edgelist 的输出将是:

0 1
0 3
1 2
于 2019-04-11T03:17:42.353 回答
0
  1. 对于读取文件,你需要 pythonfp = open('\path\to\filename.txt')

    docs.python.org提供了如何执行此操作的大量信息,并且通常是您第一次学习时搜索答案的好地方。

  2. 您可能会查看边缘列表的networkx包。他们有如何做到这一点的例子。如果你已经安装了 setuptools,你可以用easy_install networkx

于 2013-03-07T23:55:37.990 回答