我有一个这样的列表:

lst = [0, 1, 0, 5, 0, 1]

我想生成一个邻接矩阵:
out =
array([[ 1.,  0.,  1.,  0.,  1.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  1.],
       [ 1.,  0.,  1.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.],
       [ 1.,  0.,  1.,  0.,  1.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  1.]])

哪里 out[i,j] = 1 if lst[i]==lst[j]
这是我的带有两个 for 循环的代码:
lst = np.array(lst)
label_lst = list(set(lst))
out = np.eye(lst.size, dtype=np.float32)
for label in label_lst:
  idx = np.where(lst == label)[0]
  for pair in itertools.combinations(idx,2):
    out[pair[0],pair[1]] = 1
    out[pair[1],pair[0]] = 1

但我觉得应该有办法改善这一点。有什么建议吗?

最佳答案

使用 broadcasted comparison -

np.equal.outer(lst, lst).astype(int) # or convert to float

sample 运行 -
In [787]: lst = [0, 1, 0, 5, 0, 1]

In [788]: np.equal.outer(lst, lst).astype(int)
Out[788]:
array([[1, 0, 1, 0, 1, 0],
       [0, 1, 0, 0, 0, 1],
       [1, 0, 1, 0, 1, 0],
       [0, 0, 0, 1, 0, 0],
       [1, 0, 1, 0, 1, 0],
       [0, 1, 0, 0, 0, 1]])

或者转换为数组,然后手动扩展到2D并进行比较——
In [793]: a = np.asarray(lst)

In [794]: (a[:,None]==a).astype(int)
Out[794]:
array([[1, 0, 1, 0, 1, 0],
       [0, 1, 0, 0, 0, 1],
       [1, 0, 1, 0, 1, 0],
       [0, 0, 0, 1, 0, 0],
       [1, 0, 1, 0, 1, 0],
       [0, 1, 0, 0, 0, 1]])

关于python - 从列表生成邻接矩阵,其中邻接表示元素相等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46994614/

10-12 19:51