给定一些对称整数矩阵列表,我希望在以下等价关系下删除所有重复项:
如果存在一些置换s(在{1,...,k}上),使得对于{1,...,k}中的所有i和j,我们有M1_ij = M2_s(i)s(j),即如果我可以通过同时排列其行和列来从一个矩阵获得另一个矩阵,则两个k x k矩阵M1和M2是等价的。
不幸的是,我的朴素方法(在构建列表时,检查新矩阵的任何置换是否已经在列表中)证明速度太慢。
我能想到的一些可能更快的替代方法是将所有矩阵放入列表中,将它们排列成某种“规范置换”,然后按照这里所述的方式删除重复项。但是,我不确定如何在代码中实现这样的“标准置换”。
为了进一步缩小范围:矩阵相对较小(k <= 4),列表将包含大约5或6位数字的矩阵,并且矩阵的dtype必须是某种整数类型(目前为intc,但我可以更改)。
最终列表的顺序无关紧要,每个等价类的代表都可以生存。整个过程可能需要一些小时,但不需要几天。
有没有一种相对高效的方法来实现这一点?我是否(又一次)错过了一些很酷的NumPy或SciPy设施,可以帮助我处理这个问题?
如要求所示,以下是一些小例子,以演示等价关系是如何工作的:
矩阵{{1, 1, 1}, {1, 2, 0}, {1, 0, 3}}和{{1, 1, 1}, {1, 3, 0}, {1, 0, 2}}是等价的,因为置换{1,2,3}->{1,3,2}将一个转换为另一个。
矩阵{{1, 1, 1}, {1, 2, 0}, {1, 0, 3}}和{{1, 1, 0}, {1, 2, 1}, {0, 1, 3}}不等价,您不能更改1的位置而不进行对角线置换。
如果存在一些置换s(在{1,...,k}上),使得对于{1,...,k}中的所有i和j,我们有M1_ij = M2_s(i)s(j),即如果我可以通过同时排列其行和列来从一个矩阵获得另一个矩阵,则两个k x k矩阵M1和M2是等价的。
不幸的是,我的朴素方法(在构建列表时,检查新矩阵的任何置换是否已经在列表中)证明速度太慢。
我能想到的一些可能更快的替代方法是将所有矩阵放入列表中,将它们排列成某种“规范置换”,然后按照这里所述的方式删除重复项。但是,我不确定如何在代码中实现这样的“标准置换”。
为了进一步缩小范围:矩阵相对较小(k <= 4),列表将包含大约5或6位数字的矩阵,并且矩阵的dtype必须是某种整数类型(目前为intc,但我可以更改)。
最终列表的顺序无关紧要,每个等价类的代表都可以生存。整个过程可能需要一些小时,但不需要几天。
有没有一种相对高效的方法来实现这一点?我是否(又一次)错过了一些很酷的NumPy或SciPy设施,可以帮助我处理这个问题?
如要求所示,以下是一些小例子,以演示等价关系是如何工作的:
矩阵{{1, 1, 1}, {1, 2, 0}, {1, 0, 3}}和{{1, 1, 1}, {1, 3, 0}, {1, 0, 2}}是等价的,因为置换{1,2,3}->{1,3,2}将一个转换为另一个。
矩阵{{1, 1, 1}, {1, 2, 0}, {1, 0, 3}}和{{1, 1, 0}, {1, 2, 1}, {0, 1, 3}}不等价,您不能更改1的位置而不进行对角线置换。
np.sort(np.diag(M))
开始。 - jotasinp.all(np.sort(M.ravel()), np.sort(N.ravel()))
?! - Paul Brodersen