python - 你如何制作一个模拟二维网格的邻接矩阵

标签 python language-agnostic graph-theory graph-algorithm adjacency-matrix

基本上只是想知道在 python 中执行此操作的好方法是什么,我之前也在 python 中使用一种蛮力方法完成了此操作,但它不是直观的方法。因此,如果有人能提供帮助,那就太好了。

最佳答案

对于逐行网格,邻接矩阵如下所示:

  • 在一行中,相邻的数字形成两条平行的对角线。这每个占据一个 Columns × Columns 子矩阵,沿着大矩阵的对角线重复。
  • 相邻的行形成一条对角线。这占据了两条对角线,恰好在行子矩阵之外偏移。
row 1 row 2 row 3
----- ----- -----  _
A A A 1 . . . . .   |
A A A . 1 . . . .   | row 1
A A A . . 1 . . .  _|
1 . . B B B 1 . .   |
. 1 . B B B . 1 .   | row 2
. . 1 B B B . . 1  _|
. . . 1 . . C C C   |
. . . . 1 . C C C   | row 3
. . . . . 1 C C C  _|

子矩阵有两条对角线,分别在主对角线的两侧:

column
1 2 3 4 5 6
- - - - - -
. 1 . . . .  1 column
1 . 1 . . .  2
. 1 . 1 . .  3
. . 1 . 1 .  4 
. . . 1 . 1  5
. . . . 1 .  6
def make_matrix(rows, cols):
    n = rows*cols
    M = matrix(n,n)
    for r in xrange(rows):
        for c in xrange(cols):
            i = r*cols + c
            # Two inner diagonals
            if c > 0: M[i-1,i] = M[i,i-1] = 1
            # Two outer diagonals
            if r > 0: M[i-cols,i] = M[i,i-cols] = 1

对于 3 × 4 的网格,矩阵如下所示:

. 1 . . 1 . . . . . . . 
1 . 1 . . 1 . . . . . . 
. 1 . 1 . . 1 . . . . . 
. . 1 . . . . 1 . . . . 
1 . . . . 1 . . 1 . . . 
. 1 . . 1 . 1 . . 1 . . 
. . 1 . . 1 . 1 . . 1 . 
. . . 1 . . 1 . . . . 1 
. . . . 1 . . . . 1 . . 
. . . . . 1 . . 1 . 1 . 
. . . . . . 1 . . 1 . 1 
. . . . . . . 1 . . 1 . 

关于python - 你如何制作一个模拟二维网格的邻接矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16329403/

相关文章:

python - 如何将惰性变量传递给函数参数而不对其求值,除非返回

python - 有没有一个Python函数可以获取真实社区?

regex - 为什么无法使用正则表达式解析 HTML/XML : a formal explanation in layman's terms

algorithm - 检查新边是否会使 DAG 循环

algorithm - 图的团数

python - PyQt:强制弹出窗口位于前面

python - 简化txt搜索的python代码

python - 计算 numpy 数组中成对列的组合

python - 在不复制的情况下将 NumPy 数组调整为更小的大小

ios - 在不连接 APNS 的情况下向 Apple 设备发送推送通知