逐步对数组进行排序,例如excel

时间:2017-01-23 17:39:38

标签: python sorting numpy

我希望逐步对数组进行排序,就像我在Excel中一样。例如:

randomMatrix = np.asarray(
[[0, 1, 0, 1, 0, 0, 2, 0, 1, 0],
[1, 0, 0, 0, 0, 1, 0, 0, 1, 2],
[1, 1, 0, 0, 2, 0, 0, 1, 0, 0]])

我希望有一个:“按列1排序。然后,按列2排序。然后按列3等排序等。”就像我们可以在excel中产生以下内容:

sortedMatrix = np.asarray(
[[0, 1, 2, 0, 1, 0, 0, 1, 0, 0],
[0, 0, 0, 1, 1, 2, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 1, 1, 1, 2]])

我怎样才能做到这一点? This answer建议使用lexsort,但是当我这样做时,我得到:

randomMatrix[np.lexsort(randomMatrix.T[::-1])]
array([[0, 1, 0, 1, 0, 0, 2, 0, 1, 0],
       [1, 0, 0, 0, 0, 1, 0, 0, 1, 2],
       [1, 1, 0, 0, 2, 0, 0, 1, 0, 0]])

1 个答案:

答案 0 :(得分:2)

您正在按行排序,这些行与答案不同,后者按列排序,对答案的一点调整应适合您:

randomMatrix[:, np.lexsort(randomMatrix)]      # no need to transpose here but the sorting 
                                               # index has to be applied to the second axis

# array([[0, 1, 2, 0, 1, 0, 0, 1, 0, 0],
#        [0, 0, 0, 1, 1, 2, 0, 0, 1, 0],
#        [0, 0, 0, 0, 0, 0, 1, 1, 1, 2]])

同样来自文档:

  

如果为keys参数提供了2D数组,那么它的行就是   解释为排序键,排序是根据最后一个   行,倒数第二行等。

所以这里最后一行是主要排序键,第二行是次要排序键,第一行是最后一个排序键。当实际进行排序过程时,使用稳定的排序算法,排序过程将首先在第一行执行,然后第二行和主排序键将在最后阶段排序。组合在一起,np.lexsort返回一个整数索引,给出排序顺序。将此排序顺序应用于矩阵的所有行,可得到所需的输出。