У меня есть особый случай целочисленного разбиения. Я посмотрел на StackOverflow и объединил два фрагмента кода, которые я нашел. Тем не менее, это не подходит для моей цели.
Я хочу иметь массив k
неотрицательных целых чисел, которые в сумме дают N
с этим ограничением: целые числа больше нуля сортируются в порядке убывания .
Пример кода, который у меня есть:
def create_partitions(n, m = None):
if m is None:
m = n
def partitions(n, m):
if m is None or m >= n: yield [n]
for f in range(n-1 if (m is None or m >= n) else m, 0, -1):
for p in partitions(n - f, f):
yield [f] + p
result = [el for el in partitions(n, m)]
def boolean_indexing(non_even_list_of_lists):
lens = np.array([len(item) for item in non_even_list_of_lists])
mask = lens[:,None] > np.arange(lens.max())
out = np.zeros(mask.shape,dtype=int)
out[mask] = np.concatenate(non_even_list_of_lists)
return out
result_array = boolean_indexing(result)
return result_array
In [5]: create_partitions(5, 5)
Out[5]:
array([[5, 0, 0, 0, 0],
[4, 1, 0, 0, 0],
[3, 2, 0, 0, 0],
[3, 1, 1, 0, 0],
[2, 2, 1, 0, 0],
[2, 1, 1, 1, 0],
[1, 1, 1, 1, 1]])
Но есть и другие возможные варианты, такие как [4, 0, 0, 0, 1], [4, 0, 1, 0, 0], [0, 0, 0, 4, 1]
НО НЕ [1, 0, 0, 0, 4]
и др. c. Один из возможных подходов - взять результат внутренней функции partitions
и заполнить его нулями, используя numpy
другим способом:
Out[11]: [[5], [4, 1], [3, 2], [3, 1, 1], [2, 2, 1], [2, 1, 1, 1], [1, 1, 1, 1, 1]]
Как можно преобразовать этот результат в то, что я ожидать использования numpy
?