我有一个自反不等式传递关系,表示为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
的实现吗?
编辑:我想要得到一个无环有向图,我将不得不(暂时)删除“反射性”,但这不是问题。
答案 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的积分。