2016-04-12 113 views
1

所以我試圖在Python中對多維數組中的元素進行排序。數組是一團糟,這使得它很難,但不幸的是它是opencv函數返回的。在python中對x,y座標的多維維數組排序

這些都是Y,X座標(向後我知道....)

[array([[[ 13, 178]],[[ 50, 179]],[[ 49, 258]],[[ 12, 257]]]), 
array([[[ 58, 93]],[[105, 94]],[[104, 171]],[[ 57, 170]]]), 
array([[[ 13, 93]],[[ 50, 94]],[[ 49, 171]],[[ 12, 170]]]), 
array([[[ 58, 9]],[[105, 10]],[[104, 86]],[[ 57, 85]]]), 
array([[[13, 9]], [[50, 10]],[[49, 86]],[[12, 85]]]), 
array([[[ 58, 178]],[[105, 179]],[[104, 257]],[[ 57, 257]]])] 

現在我需要這個排序的方式是每個numpy的數組的第一個元素(可以稱之爲),和然後是DESCENDING中的SECOND元素。而且我需要把所有的關係都放在ASCENDING命令的FIRST元素上。

因此,這將結束是

[array([[[ 13, 178]],[[ 50, 179]],[[ 49, 258]],[[ 12, 257]]]), 
array([[[ 58, 178]],[[105, 179]],[[104, 257]],[[ 57, 257]]]), 
array([[[ 13, 93]],[[ 50, 94]],[[ 49, 171]],[[ 12, 170]]]), 
array([[[ 58, 93]],[[105, 94]],[[104, 171]],[[ 57, 170]]]), 
array([[[13, 9]], [[50, 10]],[[49, 86]],[[12, 85]]]), 
array([[[ 58, 9]],[[105, 10]],[[104, 86]],[[ 57, 85]]])] 

現在,我已經找到了如何使用

items[each][first][0][Y_POS(or X_POS)] 

其中每個是nparray訪問訪問這些元素(也有他們的6) 和Y_POS指的是y位置,而X_POS指的是x位置。

其他兩個變量第一個和0將永遠不會改變。

我真的不知道從哪裏開始,以使其有效運行,所以任何幫助表示讚賞。請記住,座標是Y,X表示法。

在此先感謝大家。

回答

0

假設A是包含所有的數據四維陣列:

I = np.argsort(A[:, 0, 0, 0]) 
A = A[I[::-1]] 
I = np.argsort(A[:, 0, 0, 1], kind='mergesort') 
A = A[I[::-1]] 

首先,我們的排序Y上以相反的順序,然後排序X上以相反的順序太大,導致在X下降,但Y中上升當X相等時。請注意,我們必須使用穩定的排序算法來防止擾亂我們第一次排序的結果; mergesort應該做的伎倆。