我有一个代码,它创建了一个形状为(m, m, ..., m)
的numpy数组A
,其中有m
的n
副本。通过构造,这个数组是一个对称Tensor(在数学意义上),这意味着A[i, j, ..., k] == A[i', j', ..., k']
,其中(i', j', ..., k')
是(i, j, ..., k)
的置换。
我们可以将A
的置换唯一元素定义为A
中对应的索引通过置换彼此不等价的条目的集合。例如,在形状为(3, 3)
的矩阵中,置换唯一索引为(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)
。
对于一个一般的对称TensorA
,我如何提取它的所有置换唯一元素,以及它们对应的索引?(np.unique
不起作用,在两个元素A[i1, j1, ..., k1]
和A[i2, j2, ..., k2]
重合相等的情况下,但(i1, j1, ..., k1)
不是(i2, j2, ..., k2)
的置换。
2条答案
按热度按时间q9yhzks01#
考虑到你的标签包含numpy,在大型数组上有一个更快的解决方案:
字符串
对于小型数组,有一些棘手的加速方法,但它们会损失一些可读性:
型
一个简单的比较方法:
型
基准:
型
的数据
eoxn13cs2#
为了回答我自己的问题:一种方法是选择所有索引
(i_1, i_2, ..., i_n)
与i_1 <= i_2 <= ... <= i_n
。伪代码是:字符串
注意事项:上面的伪代码需要预先知道
n
。一个更好的解决方案是将n
作为perm_unique()
的参数,但这需要递归,我不确定什么是最好的方法。事实证明,解决方案非常简单。下面的代码就是这样做的:
型