Целочисленное разбиение: особый случай - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть особый случай целочисленного разбиения. Я посмотрел на 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?

...