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

时间:2013-08-30 00:25:35

标签: python arrays

我有两个数组

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]])

coord 是一个坐标数组,每一行都是一个矩形。 喜欢http://i.imgur.com/EVnIzTD.jpg

我的算法应该发现七个差异,但它不是。所以我打造了一个kmeans algo,wichi让我的阵列标签

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

我的想法是修改我的数组坐标以将row3 / row4合并在一起并将row6 / row7 / row8合并在一起 [min_val_col1,max_val_col2,max_val_3,min_val_4]

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

我真的卡住了,我不知道如何继续。有人可以帮我吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

以下应该(我相信)做你需要的事情:

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比较陌生 - 我确信这可以通过我没想到的一些捷径更简单。

答案 2 :(得分:0)

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

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