像表一样对numpy数组进行排序

时间:2011-11-16 14:47:34

标签: python

我有一个清单

[[0, 3], [5, 1], [2, 1], [4, 5]]

我使用numpy.array创建了一个数组:

[[0 3]
 [5 1]
 [2 1]
 [4 5]]

如何将其排序为桌子?特别是,我希望按升序排序第二列,然后通过按升序排序第一列来解决任何关系。因此,我希望:

[[2 1]
 [5 1]
 [0 3]
 [4 5]]

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:9)

请参阅http://docs.scipy.org/doc/numpy/reference/generated/numpy.lexsort.html#numpy.lexsort

特别是在您的情况下,

import numpy as np
x = np.array([[0,3],[5,1],[2,1],[4,5]])
x[np.lexsort((x[:,0],x[:,1]))]

输出

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

答案 1 :(得分:4)

您可以使用numpy.lexsort()

>>> a = numpy.array([[0, 3], [5, 1], [2, 1], [4, 5]])
>>> a[numpy.lexsort(a.T)]
array([[2, 1],
       [5, 1],
       [0, 3],
       [4, 5]])

答案 2 :(得分:2)

另一种方法 - 切出你想要的数据位,使用argsort获取排序索引,然后使用结果来切割原始数组:

a = np.array([[0, 3], [5, 1], [2, 1], [4, 5]])

subarray = a[:,1] # 3,1,1,5

indices = np.argsort(subarray) # Returns array([1,2,0,3])

result = a[indices]

或者,一气呵成:

a[np.argsort(a[:,1])]

答案 3 :(得分:1)

如果您只想使用单个列进行排序(例如,第二列),您可以执行以下操作:

from operator import itemgetter
a = [[0, 3], [5, 1], [2, 1], [4, 5]]
a_sorted = sorted(a, key=itemgetter(1))

如果有多个密钥,请使用其他答案中指出的numpy.lexsort()。