获取平方网格的邻接矩阵

Get the adjacency matrix for a Squared Grid

提问人:Mirk 提问时间:6/14/2023 最后编辑:Mirk 更新时间:6/14/2023 访问量:26

问:

在网格 LxL 中,L 是元素数 N () 的平方根,我想获得所有彼此靠近的点的邻接矩阵,包括对角线。L=numpy.sqrt(N)

我已经创建了一个算法,但我认为不是最快的,所以我想问你如何解决这个问题。

这是我的解决方案

def get_2D_proximity(sqr_nblocks):
    ncol = sqr_nblocks
    nblocks = sqr_nblocks**2
    adj_mtx = np.zeros([nblocks, nblocks])

    for cell in range(ncol**2):
        ## right
        if (cell+1) % ncol == 0:
            pass
        else:
            adj_mtx[cell, cell+1] = 1
        ## down
        if cell >= ncol*(ncol-1):
            pass
        else:
            adj_mtx[cell, cell+ncol] = 1

        ## right-down diagonal
        if ((cell+1) % ncol == 0) | (cell >= ncol*(ncol-1)):
            pass
        else:
            adj_mtx[cell, cell+1+ncol] = 1

        ## left-down diagonal
        if ((cell) % ncol == 0) | (cell >= ncol*(ncol-1)):
            pass
        else:
            adj_mtx[cell, cell-1+ncol] = 1 

        upper_triangle_idx = np.triu_indices(adj_mtx.shape[0], k=1)
        adj_mtx.T[upper_triangle_idx] = adj_mtx[upper_triangle_idx]
    return adj_mtx 

print(get_2D_proximity(3))


#### OUTPUT ####
array([[0., 1., 0., 1., 1., 0., 0., 0., 0.],
       [1., 0., 1., 1., 1., 1., 0., 0., 0.],
       [0., 1., 0., 0., 1., 1., 0., 0., 0.],
       [1., 1., 0., 0., 1., 0., 1., 1., 0.],
       [1., 1., 1., 1., 0., 1., 1., 1., 1.],
       [0., 1., 1., 0., 1., 0., 0., 1., 1.],
       [0., 0., 0., 1., 1., 0., 0., 1., 0.],
       [0., 0., 0., 1., 1., 1., 1., 0., 1.],
       [0., 0., 0., 0., 1., 1., 0., 1., 0.]])

下面是邻接矩阵的图形表示。

Graphical representation of the adjacency matrix

Python 离散数学 邻接矩阵

评论

0赞 trincot 6/14/2023
那是什么形象?您能否在 Python 语法中提供相应的数据结构,并为其添加预期的输出?
0赞 ravenspoint 6/14/2023
查看执行相同操作的相同C++代码可能会有所帮助 github.com/JamesBremner/autocell/blob/...
0赞 Mirk 6/14/2023
谢谢,但我无法真正比较 C 和 python 代码的速度,因为它们是不同的语言。据我所知,这段代码的结构与我的相似:对于每个单元格,都会进行一堆测试,如果它通过了所有这些测试,那么它就会分配一个 1。我的问题是,既然有一个清晰的模式,我确信必须有一种矢量化的方式来一次分配所有 1,而无需遍历所有单元格
0赞 ravenspoint 6/14/2023
您可以预期 C++ 代码的速度比 python 快 50 倍。
0赞 Mirk 6/14/2023
我知道 C++ 更快,但我的问题是专门要求在 Python 中提供解决方案

答: 暂无答案