微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从二维单元格 numpy 数组中获取邻接矩阵的最佳方法

如何解决从二维单元格 numpy 数组中获取邻接矩阵的最佳方法

给定一组值:

x = array([[0,1,2],[3,4,5],[6,7,8]])

我想知道是否有一种最佳方法可以轻松获得其等效邻接矩阵:

M = array([[ inf,1.,inf,3.,4.,inf],[  0.,2.,5.,[ inf,6.,7.,8.],inf]])

这个想法实际上是在 networx 中构建一个可以使用的对象,我希望获得单元格网格的邻接矩阵,以便能够在 networkx 中加载该矩阵,但是如果有更好的方法来实现我愿意接受建议。 根据文档,我已经能够找到 grid_2d_graph () 函数,该函数允许在给定原始矩阵的 n 行和 m 列的情况下对我想要的图形进行尺寸标注,但是我希望权重从一个节点到另一个节点(如果可能),为目标节点所在数组的值。

编辑

虽然建议的例子是一个特殊情况(方阵和有序值),但问题出现在任何矩阵上,维度不一定相等和随机值。

解决方法

我认为这就是您所追求的:

def create_adj_mat(x):
    y = np.ones([x.size,np.max(x)+1]) * np.inf #initialize
    for I,i in enumerate(np.ravel(x)): 
        #get adjacent values of y and x points
        d = x[max(0,I//x.shape[1]-1):min(x.shape[0],I//x.shape[1]+2),max(0,I%x.shape[1]-1):min(x.shape[1],I%x.shape[1]+2)]
        y[I,np.ravel(d)] = np.ravel(d) 
    np.fill_diagonal(y,np.inf) #remove i,i points
    return y

它遍历输入矩阵的散列值并找到相邻值(-1 和 +2 偏移,+2 因为 python 索引)并根据这些值设置数组 y。

当您传递矩阵时,您会得到:

x = np.array([[0,1,2],[3,4,5],[6,7,8]])
y = create_adj_mat(x)
print(y)

array([[inf,1.,inf,3.,4.,inf],[ 0.,2.,5.,[inf,6.,7.,8.],inf]])

编辑

假设表示一个无序、非方阵,我对我的代码做了一个小改动,如下所示:

def create_adj_mat(x):
    y = np.ones([np.max(x)+1,I%x.shape[1]+2)] 
        y[i,i points
    return y

然后,当你传递这样一个数组时:

d = np.array([[10,3],[5,12],[2,1]])
create_adj_mat(d)
array([[inf,12.],10.,inf]])
,

使用 networkx 从数组构造隐含网络,我们 将每个有向图边的权重指定为 目标节点。然后,我们可以使用 adj_matrix() 函数来生成 矩阵:

import networkx as nx
import numpy as np

x = np.arange(9).reshape(3,3)
G = nx.DiGraph()
# Ensure nodes sort order
G.add_nodes_from(np.arange(9))
i1,j1 = x.shape
for i in range(i1):
    for j in range(j1):
        if i < i1-1:
            G.add_edge(x[i,j],x[i+1,weight=x[i+1,j])
            G.add_edge(x[i+1,x[i,weight=x[i,j])
            if j > 0:
                G.add_edge(x[i,j-1],j-1])
                G.add_edge(x[i+1,j])
        if j < j1-1:
            G.add_edge(x[i,j+1],j+1])
            G.add_edge(x[i,j])
            if i < i1-1:
                G.add_edge(x[i,j+1])
                G.add_edge(x[i+1,j])
            if i > 0:
                G.add_edge(x[i,x[i-1,weight=x[i-1,j+1])
                G.add_edge(x[i-1,j])
am1 = nx.adj_matrix(G).todense().astype(float)
np.putmask(am1,am1==0,np.inf)
print(am1)

输出:

# [[inf  1. inf  3.  4. inf inf inf inf]
#  [inf inf  2.  3.  4.  5. inf inf inf]
#  [inf  1. inf inf  4.  5. inf inf inf]
#  [inf  1. inf inf  4. inf  6.  7. inf]
#  [inf  1.  2.  3. inf  5.  6.  7.  8.]
#  [inf  1.  2. inf  4. inf inf  7.  8.]
#  [inf inf inf  3.  4. inf inf  7. inf]
#  [inf inf inf  3.  4.  5.  6. inf  8.]
#  [inf inf inf inf  4.  5. inf  7. inf]]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。