Diese Frage ähnelt einer Frage, die ich vor einigen Monaten hatte: Generating a numpy array with all combinations of numbers that sum to less than a given number. In dieser Frage wollte ich alle Zahlen, die höchstens zu einer Konstante summierten, generieren, da jedes Element ein bestimmtes Maximum hatte.Einzigartige Permutationen von Ganzzahl-Partitionen mit fester Länge, wobei jedes Element ein Maximum hat
Dieses Mal möchte ich alle Permutationen berechnen, die genau zu dieser Konstante summieren. Dies kann als Berechnung der einzigartigen Permutationen von Ganzzahlpartitionen angesehen werden, bei denen jedes Element ein bestimmtes Maximum aufweist. Das Endergebnis sollte in einem Nummernfeld gespeichert werden.
einen Generator, ein Motto erreicht, was wir wollen:
import numpy as np
from itertools import product
K = 3
maxRange = np.array([1,3,2])
states = np.array([i for i in product(*(range(i+1) for i in maxRange)) if sum(i)==K])
array([[0, 1, 2],
[0, 2, 1],
[0, 3, 0],
[1, 0, 2],
[1, 1, 1],
[1, 2, 0]])
geben Ich habe recht geringe Leistung, wenn K=20
und maxRange = [20]*6
. Die Anzahl der Permutationen ist mit 53130 begrenzt, dauert aber schon 20 Sekunden. Mein Bauchgefühl sagt mir, das sollte viel weniger als eine Sekunde dauern.
Hat jemand eine schnellere Lösung zur Verfügung? Ich habe Probleme, die Lösung zu meiner früheren Frage zu ändern, um dies zu berücksichtigen, weil ich nicht weiß, wie man die Permutationen abschneidet, für die es nicht mehr möglich ist, genau zu K
hinzuzufügen.
Ich habe nichts gegen Lösungen, die den @jit
Operator von Numba verwenden ... solange sie schneller sind als das, was ich jetzt habe!
Vielen Dank im Voraus.