按多个列对numpy二维数组进行排序

4
我有一个二维的numpy数组,长这样:
array([[5, 0],
       [3, 1],
       [7, 0],
       [2, 1]])

我想按每一列(比如从右到左)进行排序,得到这个结果:

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

如何在numpy中实现这个?

你尝试过像这样改变列索引吗:array[np.argsort(array[:, 0])] - Ugurcan
1
这个回答解决了你的问题吗?通过列对NumPy中的数组进行排序 - Ugurcan
是的,这不会保持排序后的第二列。 - Floris Fancypants
2个回答

1

Numpy 包含一个原生函数用于按列进行子排序,lexsort

idx = np.lexsort((arr[:,0], arr[:,1]))
arr_sorted = arr[idx]

如果您更熟悉pandas语法,也可以使用它;这将会有一些内存/时间开销,但对于小于1m行的数据应该很小:

arr = [
    [5,  0],
    [3,  1],
    [7,  0],
    [2,  1]
]
df = pd.DataFrame(data=arr).sort_values([1,0])
arr_sorted = df.to_numpy()

输出(双方):
array([[5, 0],
       [7, 0],
       [2, 1],
       [3, 1]])

啊,是的,但不幸的是它是一个非常大的数组。 - Floris Fancypants
@FlorisFancypants,非常大是多大?无论如何,这应该可以接受几百万行。 - anon01
哦,就像10000一样,但是lexsort也可以工作,谢谢 <3 - Floris Fancypants

0

您可以使用np.lexsort按多列对数组进行排序:

idx = np.lexsort((a[:,0], a[:,1]))

a[idx]

输出:

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

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