Определите кластеры, связанные дельтой слева и другой дельтой справа

Рассмотрим отсортированный массивa:

a = np.array([0, 2, 3, 4, 5, 10, 11, 11, 14, 19, 20, 20])

Если бы я указал левую и правую дельты,

delta_left, delta_right = 1, 1

Тогда я ожидал, что кластеры будут назначены:

#   a = [ 0  .  2  3  4  5  .  .  .  . 10 11  .  . 14  .  .  .  . 19 20
#                                         11                         20
#
#                                     [10--|-12]                 [19--|-21]
#           [1--|--3]                 [10--|-12]                 [19--|-21]
#    [-1--|--1]   [3--|--5]         [9--|-11]                 [18--|-20]
#   +--+--|--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
#              [2--|--4]                       [13--|-15]
#
#         │    ╰──┬───╯                 ╰┬─╯        │              ╰┬─╯
#         │   cluster 2                Cluster 3    │           Cluster 5
#     Cluster 1                                 Cluster 4

НОТА: Несмотря на интервал[-1, 1] делить преимущество с[1, 3]ни один из интервалов не включает в себя соседнюю точку и, следовательно, не представляет собой объединение их соответствующих кластеров.

Предполагая, что назначения кластера были сохранены в массиве с именемclustersЯ ожидаю, что результаты будут выглядеть так

print(clusters)
[1 2 2 2 2 3 3 3 4 5 5 5]

Однако предположим, что я изменил левую и правую дельты, чтобы они были разными:

delta_left, delta_right = 2, 1

Это означает, что для значенияx это должно быть объединено с любой другой точкой в ​​интервале[x - 2, x + 1]

#   a = [ 0  .  2  3  4  5  .  .  .  . 10 11  .  . 14  .  .  .  . 19 20
#                                         11                         20
#
#                                   [9-----|-12]              [18-----|-21]
#        [0-----|--3]               [9-----|-12]              [18-----|-21]
# [-2-----|--1][2-----|--5]      [8-----|-11]              [17-----|-20]
#   +--+--|--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
#           [1 ----|--4]                    [12-----|-15]
#
#         ╰─────┬─────╯                 ╰┬─╯        │              ╰┬─╯
#           cluster 1                Cluster 2      │           Cluster 4
#                                               Cluster 3

НОТА: Несмотря на интервал[9, 12] делить преимущество с[12, 15]ни один из интервалов не включает в себя соседнюю точку и, следовательно, не представляет собой объединение их соответствующих кластеров.

Предполагая, что назначения кластера были сохранены в массиве с именемclustersЯ ожидаю, что результаты будут выглядеть так:

print(clusters)
[1 1 1 1 1 2 2 2 3 4 4 4]

Ответы на вопрос(1)

Ваш ответ на вопрос