【问题标题】:Matrix of labels to adjacency matrix标签矩阵到邻接矩阵
【发布时间】:2014-10-21 12:36:02
【问题描述】:

只是想知道是否有现成的功能可以执行以下操作;给定一个矩阵 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 ]) 等等。

天真的解决方案是遍历所有条目并检查其邻居,但出于性能原因,我宁愿避免循环。

【问题讨论】:

  • 我没有在X 中得到你的邻接矩阵的表示,你能解释一下吗?
  • 在不读取数据的情况下无法转换数据,任何现成的函数都会在幕后循环遍历这些条目,因此在性能方面您不会保存任何内容。
  • @SaulloCastro:我添加了一个示例。有帮助吗?
  • @yurib: 当然可以,但循环可能是用 c++ 编写的

标签: python arrays numpy matrix adjacency-matrix


【解决方案1】:

您可以使用精美的索引直接从您的 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.]])

【讨论】:

  • 很好的解决方案,谢谢!只需一个快速修复:对于我正在寻找的 4 邻居连接,添加 G[X[:, 1:], X[:, :-1]] = 1; G[X[1:, :], X[:-1, :]] = 1; G[X[:-1, :], X[1:, :]] = 1.
  • @memecs 你的意思是...使G 对称?
  • 这不仅使矩阵对称。现在你只考虑合适的邻居。因为 G[2,5] 在您的解决方案中为 0,但应该为 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多