根据行逐步排序Numpy Python矩阵

时间:2016-01-13 15:21:05

标签: python sorting numpy matrix

我已经四处搜寻并试图找到一个似乎是一个简单问题的解决方案,但却没有提出任何问题。问题是逐步根据列来对矩阵进行排序。所以,如果我有一个像numpy矩阵:

import numpy as np
X=np.matrix([[0,0,1,2],[0,0,1,1],[0,0,0,4],[0,0,0,3],[0,1,2,5]])
print(X)
[[0 0 1 2]
 [0 0 1 1]
 [0 0 0 4]
 [0 0 0 3]
 [0 1 2 5]]

我想根据第一列,然后是第二列,第三列等来对其进行排序,以获得如下结果:

Xsorted=np.matrix([[0,0,0,3],[0,0,0,4],[0,0,1,1],[0,0,1,2],[0,1,2,5]])
print(Xsorted)
[[0,0,0,3]
 [0,0,0,4]
 [0,0,1,1]
 [0,0,1,2]
 [0,1,2,5]]

虽然我认为可以通过命名列和所有这些来对这样的矩阵进行排序,但我更倾向于使用一种排序方法,这种方法不太依赖于矩阵的大小。我正在使用Python 3.4,如果这很重要的话。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

它不会特别快,但你总是可以将你的行转换为元组,然后使用Python排序:

np.matrix(sorted(map(tuple, X.A)))

您也可以按照this answersomewhat related question的建议使用np.lexsort

X[np.lexsort(X.T[::-1])]

lexsort方法似乎更快,但您应该使用实际数据进行测试以确保:

In [20]: X = np.matrix(np.random.randint(10, size=(100,100)))

In [21]: %timeit np.matrix(sorted(map(tuple, X.A)))
100 loops, best of 3: 2.23 ms per loop

In [22]: %timeit X[np.lexsort(X.T[::-1])]
1000 loops, best of 3: 1.22 ms per loop

答案 1 :(得分:1)

下面:

data = [[0,0,1,2],[0,0,1,1],[0,0,0,4],[0,0,0,3],[0,1,2,5]]
x  = pandas.DataFrame(data)
# order of columns to sort
z = x.sort([0,1,2,3])
output = z.as_matrix()

output

array([[0, 0, 0, 3],
   [0, 0, 0, 4],
   [0, 0, 1, 1],
   [0, 0, 1, 2],
   [0, 1, 2, 5]])