Как я могу отсортировать массив в NumPy по n-му столбцу?
Например,
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
Я хотел бы отсортировать строки по второму столбцу, чтобы я вернулся:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
np.sort(a, axis=0)
это было бы удовлетворительным решением для данной матрицы. Я предложил редактирование с лучшим примером, но был отклонен, хотя на самом деле вопрос был бы гораздо более понятным. Пример должен быть примерно такимa = numpy.array([[1, 2, 3], [6, 5, 2], [3, 1, 1]])
с желаемым результатомarray([[3, 1, 1], [1, 2, 3], [6, 5, 2]])
Ответы:
@steve «s ответ на самом деле самый элегантный способ сделать это.
Для «правильного» способа смотрите аргумент порядка ключевых слов numpy.ndarray.sort
Тем не менее, вам нужно будет просматривать ваш массив как массив с полями (структурированный массив).
«Правильный» способ довольно уродлив, если вы изначально не определяли свой массив с полями ...
В качестве быстрого примера, чтобы отсортировать его и вернуть копию:
Чтобы отсортировать на месте:
@ Насколько мне известно, Стив - самый элегантный способ сделать это ...
Единственное преимущество этого метода заключается в том, что аргумент «порядок» - это список полей, по которым нужно упорядочить поиск. Например, вы можете отсортировать по второму столбцу, затем по третьему столбцу, затем по первому столбцу, указав order = ['f1', 'f2', 'f0'].
источник
ValueError: new type not compatible with array.
float
? Должен ли я что-то изменить?a = np.array([['a',1,2,3],['b',4,5,6],['c',0,0,1]])
какой подход я должен следовать?np.argsort
собой, могут занимать довольно много памяти, и, в дополнение к этому, индексирование с помощью массива также будет генерировать копию сортируемого массива.Я полагаю, это работает:
a[a[:,1].argsort()]
Это указывает на второй столбец
a
и сортирует его по нему соответственно.источник
1
здесь? индекс для сортировки?[:,1]
указывает на второй столбецa
.a[a[:,1].argsort()[::-1]]
np.sort
или нет?ind = np.argsort( a[:,1] ); a = a[ind]
Вы можете сортировать по нескольким столбцам согласно методу Стива Тджоа, используя стабильную сортировку, такую как сортировка слиянием, и сортируя индексы от наименее значимых к наиболее значимым столбцам:
Это сортирует по столбцу 0, затем 1, затем 2.
источник
В случае, если кто-то хочет использовать сортировку в критической части своих программ, вот сравнение производительности для различных предложений:
Итак, похоже, что индексация с помощью argsort является самым быстрым методом на сегодняшний день ...
источник
Из документации вики Python , я думаю , что вы можете сделать:
Выход:
источник
Из списка рассылки NumPy есть еще одно решение:
источник
a[np.lexsort(a.T[cols])]
. гдеcols=[1]
в оригинальном вопросе.У меня была похожая проблема.
Моя проблема:
Я хочу рассчитать SVD и нужно отсортировать мои собственные значения в порядке убывания. Но я хочу сохранить соответствие между собственными значениями и собственными векторами. Мои собственные значения были в первом ряду, а соответствующий собственный вектор - в том же столбце.
Поэтому я хочу отсортировать двумерный массив по столбцам по первой строке в порядке убывания.
Мое решение
Так, как это работает?
a[0,]
это только первый ряд, по которому я хочу отсортировать.Теперь я использую argsort для получения порядка индексов.
Я использую,
[::-1]
потому что мне нужно в порядке убывания.Наконец, я использую,
a[::, ...]
чтобы получить представление со столбцами в правильном порядке.источник
Немного более сложный
lexsort
пример - спуск по 1-му столбцу, второй по возрастанию по 2-му. Хитрости в томlexsort
, что он сортирует по строкам (отсюда и.T
) и отдает приоритет последним.источник
Вот еще одно решение, учитывающее все столбцы (более компактный способ ответа JJ );
Сортировка с помощью lexsort,
Вывод:
источник
Просто используя сортировку, используйте номер столбца, по которому вы хотите отсортировать.
источник
Это старый вопрос, но если вам нужно обобщить это для массивов с размерами выше 2, вот решение, которое можно легко обобщить:
Это избыточное решение для двух измерений, и
a[a[:,1].argsort()]
этого будет достаточно для ответа @ steve, однако этот ответ нельзя обобщить для более высоких измерений. Вы можете найти пример трехмерного массива в этом вопросе.Вывод:
источник