2013-08-30 4 views
0

У меня есть два массиваИзменение массива путем объединения некоторых строк

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

В моем algo должно быть обнаружено семь отличий, но это не так. Так я perfom kmeans алго, вичи сделать мой массив этикетки

этикетки является результатом 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

Можете ли вы показать некоторый код для алгоритма k-mean, который вы использовали? –

+0

на самом деле, это «подделка», потому что у меня есть некоторые проблемы со сценарием. http://stackoverflow.com/questions/18523182/result-of-kmeans-algo-changes – Marc

ответ

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 - Я уверен, что это можно сделать еще проще с некоторыми ярлык Я не думал.

0

Вы можете использовать scikit-learn dbscan, чтобы скопировать прямоугольники по расстоянию. Я думаю, вам нужно извлечь 4 точки из каждого прямоугольника и пометить их прямоугольником, к которому они принадлежат, сгруппируйте эти точки, возможно, изменив eps, пока у вас не будет всего 7 прямоугольников.

0

Я не эксперт Python, так что я уверен, что это не самый «вещий» решение в мире, но это, кажется, работает на обычных списках и 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 
Смежные вопросы