如何根据python中的第二列对2D数组(numpy.ndarray)进行排序?

时间:2014-03-27 20:37:30

标签: python arrays sorting numpy

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

2 个答案:

答案 0 :(得分:41)

使用.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]])

答案 1 :(得分:4)

sorted(Data, key=lambda row: row[1])应该这样做。