Как отсортировать 2D-массив (numpy.ndarray) на основе второго столбца в python?

Я пытаюсь преобразовать все мои коды в Python. Я хочу отсортировать массив с двумя столбцами, чтобы сортировка была основана на 2-м столбце в порядке возрастания. Затем мне нужно суммировать первые данные столбца (от первой строки до, например, 100-й строки). Я использовал "Data.sort(axis = 1)", но он не работает. Кто-нибудь есть идея решить эту проблему?

Ответы

Ответ 1

Используйте .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]])

Ответ 2

sorted(Data, key=lambda row: row[1]) должен это сделать.