我在 python 中使用 itertools生成所有关于一些对称组的向量。
基本上所有只是 x,y,z 轴和符号的排列。我只是不确定确保等效向量不重复的最佳方法是什么
- 0 = -0 因此的符号排列
[1, 2, 0]
应该是[[1, 2, 0], [1, -2, 0], [-1, 2, 0], [-1, -2, 0]]
itertools.permutations( 'AAB' )
应该产生[('A', 'B', 'A'), ('B', 'A', 'A'), ('A', 'A', 'B')]
即不通过交换等价物来复制每个元素A
我目前的解决方案:
删除dumplicate 我通过一个set
like传递它lst = list(set(lst))
。但是我不喜欢创建很多稍后被过滤掉的垃圾。它也任意改变元素的顺序。也可以仅以需要转换的可散列元素(例如元组,但不是列表或 numpy 数组)的形式创建它。
# using itertools.product and set filer
def signPermut( t ):
lst = []
n = len(t)
for signs in itertools.product( [-1,1], repeat=n):
p = [ ti*si for ti,si in zip(t,signs) ]
lst.append(tuple(p))
#return lst
return list(set(lst))
此函数通过检查零来执行符号置换,但它可能非常低效:
def permutSign( t ):
lst = [ [] ]
for c in t:
lst_ = []
if c != 0:
for p in lst:
lst_.append(p+[ c])
lst_.append(p+[-c])
else:
for p in lst:
lst_.append( p+[c])
lst = lst_
return lst
它正在工作,但我在想也许有一些预制的东西......更高效,简单和pythonic