私はvectors respecting some symmetry groupsをすべてpythonでitertoolsを使用して生成しています。itertoolsは同等の要素を削除します
基本的にすべてはx、y、z軸と符号の並べ替えだけです。等価なベクトルが重複しないようにする最良の方法は何か分かりません。
- 0 = -0従って
[1, 2, 0]
のpermuationsちょうど[[1, 2, 0], [1, -2, 0], [-1, 2, 0], [-1, -2, 0]]
itertools.permutations('AAB' )
[('A', 'B', 'A'), ('B', 'A', 'A'), ('A', 'A', 'B')]
すなわちequvalentの交換によって、各構成要素を複製しないが生成するはずであるべきである署名A
私の現在のソリューション:
餃子を取り除くにはlst = list(set(lst))
のようにset
に渡します。しかし、私はあとでフィルタリングされるゴミをたくさん作りたくありません。また、要素の順序を任意に変更します。また、それは変換を必要とするハッシュ可能な要素(例えば、タプルではなく、リストまたは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
それが動作しているが、私はプレハブの何かがあるかもしれないことを考えていた...もっと効率的に、シンプルで記号でリストを作成し、それを超えるitertools.product
の使用に関するニシキヘビ