python 如何允许组中所有点之间的最大曼哈顿距离

zxlwwiss  于 2022-12-02  发布在  Python
关注(0)|答案(1)|浏览(150)

我有一个二维数组,我想在其中创建一个组,组中的所有点之间的最大曼哈顿距离。组可以不相交。例如,从这个起始数组(10 x 10):

[[ 67  97  72  35  73  77  80  48  21  34]
 [ 11  30  16   1  71  68  72   1  81  23]
 [ 85  31  94  10  50  85  63  11  61  69]
 [ 64  36   8  37  36  72  96  20  91  19]
 [ 99  54  84  56   3  80  41  45   1   8]
 [ 97  88  21   8  54  55  88  45  63  82]
 [ 13  53   1  90  39  28  48  15  86   8]
 [ 26  63  36  36   3  29  33  26  54  58]
 [ 74  40  53  12  21  17   4  87  14  22]
 [ 23  98   3 100  85  12  65  21  83  97]]

我应该可以把它分成不同的组。
我现在有一个函数,它可以找到我可以添加到一个有起点的组中的可能点(这里munip是该组的第一个点):

def possible_munips(x, y, munip, dist_manhattan_max, temp_array):
    list = []
    for i in range(y):
        for j in range(x):
            if (j, i) != munip and munipIsValid(j, i, munip, dist_manhattan_max) and temp_array[i][j] != -1:
                list.append((j, i, temp_array[i][j]))

我遍历一个二维数组temp_array,其中已经被放入一个组的点的值被设置为-1。munipIsValid检查该点是否位于距起点的最大曼哈顿距离处。
然后,我一个接一个地添加点,直到达到所需的组长度(k),并确保每次向组中添加新点时,组都保持有效,如下所示:

munips = possible_munips(x, y, munip, dist_manhattan_max, temp_array)

while len(new_group) < k:
    point = munips[0]
    new_group.append(point)
    if not groupIsValid(new_group, distManhattanMax, len(new_group)):
        new_group.remove(point)
    munips.remove(point)
    current_sol.append(new_group)

for groups in current_sol:
    for munip in groups:
        temp_array[munip[1], munip[0]] = -1

我也试过添加一个交换函数,试图在两个组之间交换点,以使它们都有效。但有时它找不到解决方案,我留下了一个无效的组。

uoifb46i

uoifb46i1#

通俗地说,你希望找到k个分类区域,也就是所谓的聚类。在这种情况下,我建议你首先阅读聚类。在你获得足够的知识之后,你可以继续学习related question,它将这个分类推广为一个自定义的距离函数。

相关问题