Ich generiere alle vectors respecting some symmetry groups mit Iertools in Python.itertools entfernen äquivalente Elemente
Grundsätzlich ist alles nur Permutation von x, y, z-Achse und Zeichen. Ich bin nur nicht sicher, was der beste Weg ist sicherzustellen, dass äquivalente Vektoren nicht dupliziert werden.
- 0 = -0 daher unterzeichnen permuations von
[1, 2, 0]
sollte nur[[1, 2, 0], [1, -2, 0], [-1, 2, 0], [-1, -2, 0]]
itertools.permutations('AAB' )
sein sollte produzieren[('A', 'B', 'A'), ('B', 'A', 'A'), ('A', 'A', 'B')]
dh nicht jedes Element, die durch den Austausch von Vorbehalten, DuplizierenA
Meine aktuelle Lösung:
zum Entfernen von dumplicate überlasse ich es durch eine set
wie lst = list(set(lst))
. Aber ich mag es nicht, viel Müll zu erzeugen, der später herausgefiltert wird. Auch es ändert willkürlich die Reihenfolge von Elementen. Es kann auch nur in Form von hashbaren Elementen (z. B. Tupeln, aber nicht Listen oder Nummernfeldern) erstellt werden, die konvertiert werden müssen.
# 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))
Diese Funktion führt das Zeichen Permutation für Nullen mit der Überprüfung, aber es ist wahrscheinlich sehr ineffizient:
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
Es funktioniert, aber ich dachte, vielleicht gibt es etwas vorfabriziert ... effizienter , einfach und pythonic