numpy的排序不一致? Lexsort vs独特

时间:2018-11-05 13:47:46

标签: numpy-ndarray

我有一个n维坐标的numpy.ndarray。让我们坚持n = 2,用s [i] [0]表示x坐标,用s [i] [1]表示y坐标。 例如:

s = np.asarray([[-1.   , 0.  ], [ 0.  ,  0.  ], [ 0.   , 0.5 ], [ 0. ,   0.  ], [-1. ,   0.25]])
print(s)
[[-1.    0.  ]
 [ 0.    0.  ]
 [ 0.    0.5 ]
 [ 0.    0.  ]
 [-1.    0.25]]

我希望能够按字典顺序对这些点进行排序,这可以通过np.lexsort通过以下方式完成。

print(s[np.lexsort(s.transpose())])
[[-1.    0.  ]
 [ 0.    0.  ]
 [ 0.    0.  ]
 [-1.    0.25]
 [ 0.    0.5 ]]

np.lexsort始终从最后一个条目到第一个条目进行排序,即

(x_1,y_1) <= (x_2,y_2) <=> y_1 < y_2 OR y_1 == y_2 and x_1 <= x_2.

没有选项可以将顺序更改为以下内容,对吧?

(x_1,y_1) <= (x_2,y_2) <=> x_1 < x_2 OR x_1 == x_2 and y_1 <= y_2

另一方面,有函数numpy.unique返回数组中排序的唯一元素:

print(np.unique(s,axis=0))
[[-1.    0.  ]
 [-1.    0.25]
 [ 0.    0.  ]
 [ 0.    0.5 ]]

现在,元素从第一个索引到最后一个索引进行排序。而且np.unique不能更改顺序。

我需要两个功能,并且需要一致的顺序。是否可以通过“ unique”或lexsort函数更改排序优先级?

1 个答案:

答案 0 :(得分:0)

我在这里找到了一种可能的解决方案:https://stackoverflow.com/a/43825409/10552040

s[np.lexsort(np.flipud(s.transpose()))]