标签矩阵转换为邻接矩阵

1 投票
1 回答
883 浏览
提问于 2025-04-28 18:54

我在想有没有现成的函数可以完成以下操作:给定一个矩阵X,里面每个位置都有标签(可以假设这些标签是从0到N的整数),比如:

X = [[0 1 1 2 2 3 3 3],
     [0 1 1 2 2 3 3 4],
     [0 1 5 5 5 5 3 4]]

我想要得到它的邻接矩阵G,也就是说,如果i和j在X中是相邻的,那么G[i,j]就等于1,否则就是0。

举个例子,G[1,2] = 1,因为1和2在(X[0,2],X[0,3])、(X[1,2],X[1,3])等位置是相邻的。

最简单的办法是遍历所有位置,检查它们的邻居,但我希望能避免使用循环,因为这样会影响性能。

暂无标签

1 个回答

4

你可以使用一种叫做“花哨索引”的方法,直接从你的 X 数组中给 G 赋值:

import numpy as np

X = np.array([[0,1,1,2,2,3,3,3],
              [0,1,1,2,2,3,3,4],
              [0,1,5,5,5,5,3,4]])
G = np.zeros([X.max() + 1]*2)

# left-right pairs
G[X[:, :-1], X[:, 1:]] = 1
# right-left pairs
G[X[:, 1:], X[:, :-1]] = 1
# top-bottom pairs
G[X[:-1, :], X[1:, :]] = 1
# bottom-top pairs
G[X[1:, :], X[:-1, :]] = 1

print(G)
#array([[ 1.,  1.,  0.,  0.,  0.,  0.],
#       [ 1.,  1.,  1.,  0.,  0.,  1.],
#       [ 0.,  1.,  1.,  1.,  0.,  1.],
#       [ 0.,  0.,  1.,  1.,  1.,  1.],
#       [ 0.,  0.,  0.,  1.,  1.,  0.],
#       [ 0.,  1.,  1.,  1.,  0.,  1.]])

撰写回答