【发布时间】:2021-02-08 01:23:00
【问题描述】:
我需要解决什么问题?
从索引列表构建二进制矩阵。 这是我如何进行的,但我想找到一种有效的方法来避免循环
输入:
list_indices =[
[0,3,4],
[2,1,0],
[3,5]
]
预期输出:
results=[
[0,1,1,1,1,0],
[1,0,1,0,0,0],
[0,0,0,0,0,0],
[1,0,0,0,1,1],
[1,0,0,1,0,0],
[0,0,1,0,0,0],
]
结果对应于从索引列表构造的二进制邻接(对称)矩阵。结果中的 1 对应于属于同一行 list_indices 的一对索引。
list_indices 中的对是:
row 1 : (0,3), (3,0), (0,4),(4,0), (3,4), (4,3)
row 2 : (0,1), (1,0), (2,0), (0,2),(1,2), (2,1)
row 3 : (3,5), (5,3)
number of column and number of rows in results = np.max(list_indices)+1=6
我尝试了什么?
results=np.zeros((np.max(list_indices)+1,np.max(list_indices)+1))
for pair in itertools.combinations(list_indices, r=2) :
results[pair[0],pair[1]]=results[pair[1],pair[0]]=1.0
构建它的有效方法是什么? (避免循环)
itertools.combinations 返回一个对列表,然后用于填充矩阵结果。由于矩阵是对称的,itertools.combinations 提供了对应于上对角矩阵的对列表。对角线设置为零
【问题讨论】:
-
是什么让你觉得这个for循环效率不高?无论做什么都必须遍历所有索引对。
-
我正在寻找一种 pytonic/vectorized 的方式来编写它。我认为在要填充 200,000 对和 700,000 个元素的矩阵的情况下效率不高
-
什么déjà-vu。这似乎是所有简单路径联合的问题(提示:
networkx.all_simple_paths(G, i, j, cutoff=2)的每一对(i, j)的顶点networkx.Graph(G)。当我试图解决 Codesignal Graphs Arcade 中的问题 3 时出现了这个问题,所以我经历了研究了很久,终于找到了解决办法,很快就贴出来了。
标签: python list numpy itertools adjacency-matrix