像表格一样排序numpy数组

8 投票
4 回答
8095 浏览
提问于 2025-04-17 06:26

我有一个列表

[[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 个回答

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])]
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]])
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]])

撰写回答