我希望逐步对数组进行排序,就像我在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]])
答案 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
返回一个整数索引,给出排序顺序。将此排序顺序应用于矩阵的所有行,可得到所需的输出。