从自反的非对称传递关系中删除不必要的对

时间:2019-10-22 07:02:17

标签: numpy graph scipy relation minimum-spanning-tree

我有一个自反不等式传递关系,表示为new MiniCssExtractPlugin({ ignoreOrder: true, }), x n稀疏n scipy矩阵。

现在,由于进行了一些转换,我剩下了许多“不必要的”对:

csr

我需要删除set([('a','b'),('b','c'),('a','c')]) 对,当存在“间接”对时,它们可视为“直接”边。

首先,我认为这是一个特殊的spanning arborescence,但实际上在以下情况下:

('a','c')

...不应删除任何一对。结果不一定是一棵树。

  • 这种问题有名字吗?

  • set([('a','b'),('b','d'),('a','c'),('c','d')]) 中是否有实现?

  • 如果没有,您能否建议使用scipy / python / numpy的高效算法?

编辑:好像这样称为传递式还原?  但是没有scipy的实现吗?

编辑:我想要得到一个无环有向图,我将不得不(暂时)删除“反射性”,但这不是问题。

1 个答案:

答案 0 :(得分:0)

因此,该问题称为有向无环图的传递减少

以下代码应该可以解决问题,尽管它可能远非最佳选择:

def transitive_reduction(edges): # edges is irreflexive and scipy sparse bool
    reduction = edges.copy()
    num, i    = 99,2
    while num > 0:
        new        = edges**i
        num        = len(new.nonzero()[0])
        reduction  = reduction > new
        i         += 1
        reduction.eliminate_zeros() # might or might not be required
    return reduction

说明:只要存在该长度的路径,我们就会从reduction中删除所有存在长度为i的间接路径的直接路径。

@PaulPanzer的积分。