我有两个数组
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
我真的卡住了,我不知道如何继续。有人可以帮我吗?
答案 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