标签矩阵转换为邻接矩阵
我在想有没有现成的函数可以完成以下操作:给定一个矩阵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.]])