如何创建一个关联矩阵

3

我正在尝试创建

[[ 1,  1,  1,  0,  0,  0,  0,  0,  0],
 [-1,  0,  0,  1,  1,  0,  0,  0,  0],
 [ 0, -1,  0, -1,  0,  1,  1,  0,  0],
 [ 0,  0,  0,  0, -1, -1,  0,  1,  0],
 [ 0,  0, -1,  0,  0,  0, -1,  0,  1],
 [ 0,  0,  0,  0,  0,  0,  0, -1, -1]]

S=[1, 2, 3, 4, 5, 6]
D=[[1, 2], [1, 3], [1, 5], [2, 3], [2, 4], [3, 4], [3, 5], [4, 6], [5, 6]]
INC = [[0]*len(D) for _ in range(len(S))]

for i in range(len(D)):

在这之后,我做了一些错误的操作,结果只得到了一个零矩阵。

    for j in S:
        if i == j:
            INC.append(1)

我曾尝试将D分成两个不同的列表,但这对我来说开始变得太复杂了。

my_list1 = [i[0] for i in D]
my_list2 = [i[1] for i in D]

这个关联矩阵有没有规律?如果有规律的话,可能会帮助我们想出一个答案。我不确定如何制作它。 - Adam Hughes
你想要什么?给定两个坐标列表,你想要一个由{+1, 0, -1}组成的矩阵,其中这些坐标对应的值为+/-1? - Nick T
2个回答

7
我猜测您想要做什么...您的变量名称很差。我建议使用NetworkX(networkx库,让它完成所有数学计算。
import networkx as nx

nodes = [1, 2, 3, 4, 5, 6]
edges = [[1, 2], [1, 3], [1, 5], [2, 3], [2, 4], [3, 4], [3, 5], [4, 6], [5, 6]]

G = nx.DiGraph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)

incidence_matrix = -nx.incidence_matrix(G, oriented=True) 
# ^ this returns a scipy sparse matrix, can convert into the full array as below
# (as long as your node count is reasonable: this'll have that squared elements)
print(incidence_matrix.toarray())

输出:

[[ 1.  1.  1.  0.  0.  0.  0.  0.  0.]
 [-1.  0.  0.  1.  1.  0.  0.  0.  0.]
 [ 0. -1.  0. -1.  0.  1.  1.  0.  0.]
 [ 0.  0.  0.  0. -1. -1.  0.  1.  0.]
 [ 0.  0. -1.  0.  0.  0. -1.  0.  1.]
 [ 0.  0.  0.  0.  0.  0.  0. -1. -1.]]

你会如何处理权重? - FaCoffee
权重可以作为参数分配给每个边,例如 G.add_edge(1, 2, weight=3),它将权重值3分配给节点1和2之间的边。 - TommasoF

1

我提供的只是另一种与你版本不同的方法,但你可以将其作为灵感。我认为你应该阅读关于append的内容。

无论如何,这是我对于你的关联矩阵的看法:

rows = 6
cols = 9
ones = [[0,1,2], [0,4,5], [1,3,5,6], [4,5,7], [3,6,8], [7, 8]]

INC = [ [ 0 for i in xrange(cols) ] for j in xrange(rows) ]

for i,row in enumerate(ones):
    for col in row:
        INC[i][col] = 1

[[1, 1, 1, 0, 0, 0, 0, 0, 0], 
 [1, 0, 0, 0, 1, 1, 0, 0, 0], 
 [0, 1, 0, 1, 0, 1, 1, 0, 0], 
 [0, 0, 0, 0, 1, 1, 0, 1, 0], 
 [0, 0, 0, 1, 0, 0, 1, 0, 1], 
 [0, 0, 0, 0, 0, 0, 0, 1, 1]]

请注意,我正在操作行而不是列,因为我怀疑你正在操作列。 通过将“edges”中的值变为+/-来插入“-1”,如果您想要实现此版本,请使用if-,elif +,else pass。 在Python3中,“xrange”必须更改为“range”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接