python - 使用欧几里得距离的 Numpy 数组的邻接矩阵
问题描述
有人可以帮助我如何根据所有行之间的欧几里德距离(即 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. ]]
解决方案
假设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. ]])
推荐阅读
- r - DT::datatable 不会在 HTML R 降价报告中呈现结果
- javascript - 在 React 中创建一个字段或所有字段
- r - 从 Shiny 中的一行动态数据表中渲染多个图像
- c# - Tesseract.NET SDK 弄乱了一些数字
- html - 随着屏幕尺寸变小,如何每行显示 3 个 div
- python - 当 python 脚本崩溃时,csv writer 留下空的输出文件
- wpf - UWP BarcodeScanner DataRecieved 事件未在 WPF 应用程序中触发
- r - 在已绘制的地图上添加传单 R 上的圆形标记
- arrays - 如何从c中的字符串数组中删除重复的字符串
- google-app-engine - 通过从 AppEngine 部署的应用程序从谷歌分析中提取数据时出现 500 错误