【问题标题】:Convert interaction list between proteins into a matrix using numpy使用 numpy 将蛋白质之间的相互作用列表转换为矩阵
【发布时间】:2022-01-18 01:44:57
【问题描述】:

为了计算图拉普拉斯 L,需要邻接矩阵。 我有蛋白质列表(节点):

['A', 'B', 'C', 'D', 'E', 'F']

以及这种蛋白质(边缘)之间的相互作用列表:

[('B', 'A'), ('D', 'A'), ('F', 'D'), ('A', 'D'), ('A', 'B'), ('E', 'B'), ('C', 'D'), ('E', 'C'), ('D', 'B'), ('C', 'E'), ('A', 'C'), ('C', 'B'), ('B', 'D'), ('D', 'F'), ('B', 'E'), ('C', 'A'), ('D', 'C'), ('B', 'C')]

如何将列表转换为邻接矩阵,如果发生交互,则值为 1,否则为 0,仅使用 numpy。

输出将是:

    A   B   C   D   E   F
A   0   1   1   1   0   0
B   1   0   1   1   1   0
C   1   1   0   1   1   0
D   1   1   1   0   0   1
E   0   1   1   0   0   0
F   0   0   0   1   0   0

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: python numpy matrix


【解决方案1】:

我会说构建一个 zeros 数组,然后放入一些数组

import numpy as np

prot = ['A', 'B', 'C', 'D', 'E', 'F']
edges = [('B', 'A'), ('D', 'A'), ('F', 'D'), ('A', 'D'), ('A', 'B'), ('E', 'B'),
         ('C', 'D'), ('E', 'C'), ('D', 'B'), ('C', 'E'), ('A', 'C'), ('C', 'B'),
         ('B', 'D'), ('D', 'F'), ('B', 'E'), ('C', 'A'), ('D', 'C'), ('B', 'C')]

result = np.zeros((len(prot), len(prot)))

for start, end in edges:
    result[prot.index(start), prot.index(end)] = 1

【讨论】:

    【解决方案2】:

    另一种选择是将边缘映射到相应的索引:

    nodes = ['A', 'B', 'C', 'D', 'E', 'F']
    edges = np.array([('B', 'A'), ('D', 'A'), ('F', 'D'), ('A', 'D'), ('A', 'B'), ('E', 'B'), ('C', 'D'), ('E', 'C'), ('D', 'B'), ('C', 'E'), ('A', 'C'), ('C', 'B'), ('B', 'D'), ('D', 'F'), ('B', 'E'), ('C', 'A'), ('D', 'C'), ('B', 'C')])
    edges_idx = np.searchsorted(nodes, edges.ravel()).reshape(-1,2) # [[1, 0], [3, 0], [5, 3], ..., [3, 2], [1, 2]]
    result = np.zeros((len(nodes), len(nodes)), dtype=np.uint8)
    x, y = np.transpose(edges_idx)
    result[x, y] += 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2021-08-27
      • 2022-07-14
      • 1970-01-01
      • 2020-03-03
      相关资源
      最近更新 更多