我已经四处搜寻并试图找到一个似乎是一个简单问题的解决方案,但却没有提出任何问题。问题是逐步根据列来对矩阵进行排序。所以,如果我有一个像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,如果这很重要的话。
非常感谢任何帮助!
答案 0 :(得分:2)
它不会特别快,但你总是可以将你的行转换为元组,然后使用Python排序:
np.matrix(sorted(map(tuple, X.A)))
您也可以按照this answer中somewhat 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]])