【问题标题】:Modify an array by merging some rows通过合并一些行来修改数组
【发布时间】:2013-08-30 00:25:34
【问题描述】:

我有两个数组

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 算法,让我的数组 label

label 是 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

我真的被困住了,我不知道如何进行。有人可以帮帮我吗?

【问题讨论】:

标签: python arrays


【解决方案1】:

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

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】:

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

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-09
        • 1970-01-01
        • 2019-12-07
        • 2016-09-30
        • 2020-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多