只是想知道是否有现成的功能来执行以下操作;给定矩阵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]中相邻])等。
天真的解决方案是遍历所有条目并检查其邻居,但出于性能原因,我宁愿避免循环。
答案 0 :(得分:3)
您可以使用花式索引直接从G
数组中分配X
的值:
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.]])