在python中对x,y坐标的多维维度数组进行排序

时间:2016-04-12 04:53:27

标签: python list sorting numpy multidimensional-array

所以我试图在python中对多维元素数组进行排序。数组是一个混乱,这使得它如此困难,但不幸的是它是opencv函数返回的。

这些是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数组的第一个元素(让我们称之为a),然后是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位置。

其他两个变量first和0永远不会改变。

我真的不知道从哪里开始使它有效运行,所以任何帮助都表示赞赏。请记住,坐标是Y,X表示法。

先谢谢大家。

1 个答案:

答案 0 :(得分:0)

鉴于A是包含所有数据的4d数组:

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下降,但当X相等时,Y上升。请注意,我们必须使用稳定的排序算法来防止加扰我们的第一次排序; mergesort应该可以解决问题。