在Python中如何从邻接列表中选择子矩阵?

在Python中如何从邻接列表中选择子矩阵?,python,numpy,matrix,graph,Python,Numpy,Matrix,Graph,我有一个邻接列表,其中每个数组表示该行的非零列(例如,下面的邻接列表中的第0个数组表示第2列和第6列为1,其他所有列均为0) adj_list=[[2,6],[1,3,24],[2,4],[3,5,21],[4,6,10],[1,5, 7], [6, 8, 9], [7], [7, 10, 14], [5, 9, 11], [10, 12, 18], [11, 13], [12, 14, 15], [9, 13], [13, 16, 17], [15], [15], [11, 19, 20],

我有一个邻接列表,其中每个数组表示该行的非零列(例如,下面的邻接列表中的第0个数组表示第2列和第6列为1,其他所有列均为0)

adj_list=[[2,6],[1,3,24],[2,4],[3,5,21],[4,6,10],[1,5, 7], [6, 8, 9], [7], [7, 10, 14], [5, 9, 11], [10, 12, 18], [11, 13], [12, 14, 15], [9, 13], [13, 16, 17], [15], [15], [11, 19, 20], [18], [18] ,[4,22,23],[21],[21],[2,25,26],[24],[24]]

考虑到这一点。列表中,我想选择一个子矩阵,该子矩阵具有相同的行和列索引,如下所示:

submatrix = (0, 1, 2, 5, 22)
子矩阵中的每个元素表示一个行号

1) 对于子矩阵中的每一行
i
,我需要从
adj_list
获取
ith
数组(这相当于从邻接矩阵获取
ith
行)

2) 然后从该数组中,我需要提取与子矩阵匹配的项

例如,如果我当前正在查看子矩阵
中的第三个元素,即5,那么我需要转到adj_列表中的第五个数组(相当于获取第五行调整矩阵),即[1,5,7],然后我需要查看[1,5,7]中的哪些元素与子矩阵匹配(相当于获取第五行的第1、第5和第7列)。在这种情况下,第5行的结果应该是[0,1,0,1,0],因为只有1和5在两个数组中相交)

如何在给定adj的情况下有效地选择此子矩阵。名单

adj_list = [[2, 6], [1, 3, 24], [2, 4], [3, 5, 21], [4, 6, 10], [1, 5, 7], [6, 8, 9], [7], [7, 10, 14], [5, 9, 11], [10, 12, 18], [11, 13], [12, 14, 15], [9, 13], [13, 16, 17], [15], [15], [11, 19, 20], [18], [18], [4, 22, 23], [21], [21], [2, 25, 26], [24], [24]]

submatrix = (0, 1, 2, 5, 22)

result = [[i in adj_list[sm] for i in submatrix] for sm in submatrix]

应该这样做;虽然我怀疑如果你更仔细地考虑你的最终目标,你可能更喜欢计算别的东西。

你的问题对我来说并不十分清楚,你所说的“0, 1, 2(5, 22)”给出的子矩阵是什么意思?你能给出你期望的确切结果吗?很抱歉造成混乱,我更新了问题。基本上,我将邻接矩阵转换为邻接列表。子矩阵对我要从邻接矩阵中提取的行和列进行编码(例如,我需要选择第0、第1、第2、第5、第22行,从每一行中我需要选择第0、第1、第2、第5、第22列)。解决这个问题并不难,但取决于您进一步的计划和需要,我会看看scipy.sparse,或者是可用的优秀图形库之一。这可以帮你省去为你的答案重新发明很多轮子。我的最终目标是得到“result”数组的上三角,所以实际上我不需要看矩阵的一半,因为它是对称的。现在,我得到它的上三角作为result=[map(int,[i-in[sm]表示子矩阵中的i]),对于子矩阵中的sm]upper=[el表示arr在[result[i][i+1:]表示范围内的i(len(result)-1)],对于arr中的el],但我想知道是否有一种方法可以直接得到这个上三角,而不必先计算“result”数组。