如何在Python中按第二列对2D数组(numpy.ndarray)进行排序?

31

我正在尝试将所有的代码转换为Python。我想对一个有两列的数组进行排序,排序必须基于第二列的升序。然后我需要对第一列的数据求和(例如,从第一行到第100行)。我使用了"Data.sort(axis=1)",但它不起作用。有没有人有解决这个问题的想法?

2个回答

63

使用 .argsort(),它返回一个索引的 numpy.array,用于对给定的 numpy.array 进行排序。您可以将其作为函数或方法调用数组。例如,假设你有:

import numpy as np

arr = np.array([[-0.30565392, -0.96605562],
                [ 0.85331367, -2.62963495],
                [ 0.87839643, -0.28283675],
                [ 0.72676698,  0.93213482],
                [-0.52007354,  0.27752806],
                [-0.08701666,  0.22764316],
                [-1.78897817,  0.50737573],
                [ 0.62260038, -1.96012161],
                [-1.98231706,  0.36523876],
                [-1.07587382, -2.3022289 ]])

您现在可以在要排序的列上调用.argsort(),它将给出一个按照该特定列排序的行索引数组,您可以将其作为索引传递到原始数组中。

>>> arr[arr[:, 1].argsort()]
array([[ 0.85331367, -2.62963495],
       [-1.07587382, -2.3022289 ],
       [ 0.62260038, -1.96012161],
       [-0.30565392, -0.96605562],
       [ 0.87839643, -0.28283675],
       [-0.08701666,  0.22764316],
       [-0.52007354,  0.27752806],
       [-1.98231706,  0.36523876],
       [-1.78897817,  0.50737573],
       [ 0.72676698,  0.93213482]])

您可以等价地使用 numpy.argsort()

>>> arr[np.argsort(arr[:, 1])]
array([[ 0.85331367, -2.62963495],
       [-1.07587382, -2.3022289 ],
       [ 0.62260038, -1.96012161],
       [-0.30565392, -0.96605562],
       [ 0.87839643, -0.28283675],
       [-0.08701666,  0.22764316],
       [-0.52007354,  0.27752806],
       [-1.98231706,  0.36523876],
       [-1.78897817,  0.50737573],
       [ 0.72676698,  0.93213482]])

4

sorted(Data, key=lambda row: row[1])可以实现此功能。


使用这个命令,我遇到了之前的问题,即排序时出现重复。如果输入数据为:Data=[1.0 0.70 0.0 0.69 3.0 0.57 0.0 0.68 1.0 0.56 2.0 0.51] 排序结果为:[[0.0', '0.68'], ['0.0', '0.69'], ['0.70', '1.0'],['0.56', '1.0'], ['0.51', '2.0'], ['0.57', '3.0']] 你有其他想法吗? - Sam
很抱歉,我不太明白问题所在。哪里出现了重复?如果您的输入数据 Data 是一个平面列表,为什么对其进行排序会导致一个列表的列表呢? - a p

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