通过合并一些行来修改数组

2024-03-29 09:59:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数组

label = array([2, 4, 1, 1, 6, 0, 0, 0, 3, 5])

coord = array([[370,  31, 411,  15],
               [246, 122, 316,  73],
               [423, 139, 430, 134],
               [420, 143, 429, 140],
               [ 57, 199,  99, 180],
               [387, 272, 390, 267],
               [390, 277, 393, 272],
               [396, 287, 399, 283],
               [ 75, 318, 102, 295],
               [556, 333, 568, 308]])

坐标是一个坐标数组,每行是一个矩形。 就像那样http://i.imgur.com/EVnIzTD.jpg

我的算法应该能发现七个不同点,但它不能。所以我用kmeans算法,我把我的数组标记为

标签是kmeans算法的结果。它表明第3-4行和第6、7、8行应该是同一个矩形

这个想法是修改我的数组坐标,按照这个模式将第3行/第4行和第6行/第7行/第8行合并在一起[最小值列1,最大值列2,最大值列3,最小值列4]

结果应该是这样的=>;http://i.imgur.com/XBQ0hHs.png

我真的被困住了,不知道该怎么办。有人能帮我吗?你知道吗


Tags: 标记com算法http标签数组arraylabel
3条回答

可以使用scikit-learn dbscan按距离对矩形进行聚类。我认为您需要从每个矩形中提取4个点,并用它们所属的矩形标记它们,对这些点进行聚类,或者更改eps,直到总共有7个矩形。你知道吗

我认为,以下几点可以满足您的需要:

u = unique(label)
new_coord = empty((len(u), 4))

i = 0
for j in u:
    rects = compress(label == j, coord, 0)

    mn = rects.min(0)
    mx = rects.max(0)

    new_coord[i] = (mn[0], mx[1], mx[2], mn[3])

    i += 1

print new_coord

基本上,它在label数组中找到唯一的值,并使用它们拉出coord数组中每个对应的矩形组。然后计算出这些矩形组中每列的最小值和最大值,并使用这些值填充new_coord数组中的新矩形。你知道吗

在示例数组中使用此选项,我得到以下输出:

[[ 387.  287.  399.  267.]
 [ 420.  143.  430.  134.]
 [ 370.   31.  411.   15.]
 [  75.  318.  102.  295.]
 [ 246.  122.  316.   73.]
 [ 556.  333.  568.  308.]
 [  57.  199.   99.  180.]]

请注意,虽然我对NumPy是比较新的-我相信这可以通过一些我没有想到的捷径变得更简单。你知道吗

我不是Python专家,所以我肯定这不是世界上最“pythonic”的解决方案,但它似乎适用于普通的列表和LOL:

gotBox = {}
for i in range(len(label)):
    index = label[i]
    if index in gotBox:
        gotBox[index][0] = min(gotBox[index][0], coord[i][0])
        gotBox[index][1] = max(gotBox[index][1], coord[i][1])
        gotBox[index][2] = max(gotBox[index][2], coord[i][2])
        gotBox[index][3] = min(gotBox[index][3], coord[i][3])
    else:
        gotBox[index] = coord[i]

uniques = [gotBox[i] for i in gotBox]
print uniques

相关问题 更多 >