将numpy数组按表格形式排序

8
我有一个列表。
[[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个回答

9

嗨,谢谢你的解决方案。我最喜欢这个,因为它向我展示了通过将x [:, 0]替换为x [::-1,0],我能够反转第二个排序(第一列的排序)。非常感谢大家! - Derek

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

另一种方法是:切分出你需要的数据,使用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])]

2
这并不一定按照领带的顺序排序(第一列按升序排列)。 - Bruno
真的 - 在这里看起来lexsort是更好的选择 - FredL

1
如果您只想使用单个列(例如第二列)进行排序,可以执行以下操作:
from operator import itemgetter
a = [[0, 3], [5, 1], [2, 1], [4, 5]]
a_sorted = sorted(a, key=itemgetter(1))

如果有多个关键字,那么可以使用numpy.lexsort(),正如其他答案中所指出的。

谢谢你,对于我的情况,numpy.array(sorted(a, key=itemgetter(1))) 运行得非常完美,而且是最易读的选项。 - firegurafiku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接