【问题标题】:Creating tuples of multiples from pairs of indices从索引对创建倍数元组
【发布时间】:2018-07-10 11:16:04
【问题描述】:

给定一个 numpy 数组,它可以是满足给定条件的数组元素索引的子集。如何从生成的索引对创建三元组(或四元组、五元组……)的元组?

在下面的示例中,pairs_tuples 等于 [(1, 0), (3, 0), (3, 1), (3, 2)]。 triplets_tuples 应该是 [(0, 1, 3)] 因为它的所有元素(即 (1, 0), (3, 0), (3, 1))都有满足条件的成对值,而 (3, 2)才不是。

a = np.array([[0.        , 0.        , 0.        , 0.        , 0.      ],
              [0.96078379, 0.        , 0.        , 0.        , 0.      ],
              [0.05498203, 0.0552454 , 0.        , 0.        , 0.      ],
              [0.46005028, 0.45468466, 0.11167813, 0.        , 0.      ],
              [0.1030161 , 0.10350956, 0.00109096, 0.00928037, 0.      ]])

pairs = np.where((a >= .11) & (a <= .99))
pairs_tuples = list(zip(pairs[0].tolist(), pairs[1].tolist()))
# [(1, 0), (3, 0), (3, 1), (3, 2)]

如何到达下方?

triplets_tuples = [(0, 1, 3)]
quadruplets_tuples = []
quintuplets_tuples = []

【问题讨论】:

  • 你能更准确地定义“它的所有元素”吗?你如何从(0, 1, 3)[(1, 0), (3, 0), (3, 1)]?为什么(0, 1) 没有出现在那个集合中?
  • 我想这是the clique problem
  • 你的输入矩阵总是下三角吗?
  • 感谢您的 cmets 和问题。输入矩阵可以被认为是相关矩阵的下三角。鞋面只是对称的,因此对 (1, 0) 等价于/可与对 (0, 1)) 交换。我想找到所有满足成对条件的索引的三元组(或 n-let,其中 n>2),即在示例中,索引 [(0, 1, 3)] 是唯一有效的三元组,因为所有对((1, 0), (3, 0), (3, 1)) 三元组内满足条件。
  • np.transpose(pairs) 简化了获取对。

标签: python arrays numpy tuples pairwise


【解决方案1】:

这有一个简单的部分和一个NP部分。这是简单部分的解决方案。

假设您有完整的相关矩阵:

>>> c = a + a.T
>>> c
array([[0.        , 0.96078379, 0.05498203, 0.46005028, 0.1030161 ],
       [0.96078379, 0.        , 0.0552454 , 0.45468466, 0.10350956],
       [0.05498203, 0.0552454 , 0.        , 0.11167813, 0.00109096],
       [0.46005028, 0.45468466, 0.11167813, 0.        , 0.00928037],
       [0.1030161 , 0.10350956, 0.00109096, 0.00928037, 0.        ]])

您正在做的是将其转换为adjacency matrix

>>> adj = (a >= .11) & (a <= .99)
>>> adj.astype(int)  # for readability below - False and True take a lot of space
array([[0, 1, 0, 1, 0],
       [1, 0, 0, 1, 0],
       [0, 0, 0, 1, 0],
       [1, 1, 1, 0, 0],
       [0, 0, 0, 0, 0]])

这现在表示一个图表,其中列和行对应于节点,1 是它们之间的一条线。我们可以使用networkx 将其可视化:

import networkx
g = networkx.from_numpy_matrix(adj)
networkx.draw(g)

您正在此图中寻找最大的全连接子图或“集团”。这是the Clique problem,是NP 部分。值得庆幸的是,networkx 也可以解决这个问题:

>>> list(networkx.find_cliques(g))
[[3, 0, 1], [3, 2], [4]]

[3, 0, 1] 是你的三胞胎之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多