【问题标题】:Adjacency Matrix from Numpy array using Euclidean Distance使用欧几里得距离的 Numpy 数组的邻接矩阵
【发布时间】:2021-04-23 13:27:53
【问题描述】:

有人可以帮助我了解如何根据所有行之间的欧几里德距离(即 0 和 1、0 和 2、.. 1 和 2、...)从 numpy 数组生成加权邻接矩阵吗?

给定以下带有输入矩阵 (5, 4) 的示例:

matrix = [[2,10,9,6],
          [5,1,4,7],
          [3,2,1,0], 
          [10, 20, 1, 4], 
          [17, 3, 5, 18]]

我想获得一个加权邻接矩阵(5,5),其中包含节点之间的最小距离,即

if dist(row0, row1)= 10,77 and dist(row0, row2)= 12,84, 

--> the output matrix will take the first distance as a column value. 

我已经用以下代码解决了生成邻接矩阵的第一部分:

from scipy.spatial.distance import cdist
dist = cdist( matrix, matrix, metric='euclidean')

我得到以下结果:

array([[ 0.        , 10.77032961, 12.84523258, 15.23154621, 20.83266666],
       [10.77032961,  0.        ,  7.93725393, 20.09975124, 16.43167673],
       [12.84523258,  7.93725393,  0.        , 19.72308292, 23.17326045],
       [15.23154621, 20.09975124, 19.72308292,  0.        , 23.4520788 ],
       [20.83266666, 16.43167673, 23.17326045, 23.4520788 ,  0.        ]])

但我还不知道如何指定我们为其选择的邻居数量,例如为每个节点选择 2 个邻居。例如,我们定义邻居的数量 N = 2,然后对于每一行,我们只选择两个最小距离的邻居,我们得到结果:

[[ 0.        , 10.77032961, 12.84523258, 0, 0],
       [10.77032961,  0.        ,  7.93725393, 0, 0],
       [12.84523258,  7.93725393,  0.        , 0, 0],
       [15.23154621, 0, 19.72308292,  0.        , 0 ],
       [20.83266666, 16.43167673, 0, 0 ,  0.        ]]

【问题讨论】:

  • 您能否详细说明您认为节点是什么?是一排吗?您的示例输入所需的邻接矩阵输出是什么?
  • 您好 Ehsan,感谢您的关注,是的,我的意思是逐个节点。我已经更新了出版物。
  • 感谢您的清晰解释。请检查建议的答案是否能解决您的问题。
  • np.argsortnp.where检查我的解决方案

标签: python numpy matrix euclidean-distance adjacency-matrix


【解决方案1】:

您可以使用这个更简洁的解决方案从矩阵中获取最小的 n。试试下面的 -

dist.argsort(1).argsort(1) 在轴 = 1 上创建排名顺序(最小为 0,最大为 4),np.where 过滤或替换为 0。

np.where(dist.argsort(1).argsort(1) <= 2, dist, 0)
array([[ 0.        , 10.77032961, 12.84523258,  0.        ,  0.        ],
       [10.77032961,  0.        ,  7.93725393,  0.        ,  0.        ],
       [12.84523258,  7.93725393,  0.        ,  0.        ,  0.        ],
       [15.23154621,  0.        , 19.72308292,  0.        ,  0.        ],
       [20.83266666, 16.43167673,  0.        ,  0.        ,  0.        ]])

这适用于任何轴,或者如果您也想要矩阵中的 nlargest 或 nsmallest。

【讨论】:

  • 你好 Akshay,我试过了,它成功了,谢谢你为我提供了另一个解释足够的解决方案。
【解决方案2】:

假设a 是您的欧几里得距离矩阵,您可以使用np.argpartition 选择n 每行的最小值/最大值。请记住,对角线始终为 0 且欧式距离为非负数,因此要在每行中保留两个最近点,您需要每行保留 3 分钟(包括对角线上的 0)。但是,如果您想进行最大操作,则此方法不成立。

a[np.arange(a.shape[0])[:,None],np.argpartition(a, 3, axis=1)[:,3:]] = 0 

输出:

array([[ 0.        , 10.77032961, 12.84523258,  0.        ,  0.        ],
       [10.77032961,  0.        ,  7.93725393,  0.        ,  0.        ],
       [12.84523258,  7.93725393,  0.        ,  0.        ,  0.        ],
       [15.23154621,  0.        , 19.72308292,  0.        ,  0.        ],
       [20.83266666, 16.43167673,  0.        ,  0.        ,  0.        ]])

【讨论】:

  • 它有效。谢谢你,非常感谢你的帮助。
猜你喜欢
  • 2013-10-21
  • 2017-01-05
  • 2014-05-08
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
相关资源
最近更新 更多