2D сортировка с помощью NumPy — сортировка 1 строки, а другая — сортировка

#python #sorting #numpy #scipy

#python #сортировка #numpy #scipy

Вопрос:

Допустим, у меня есть массив NumPy:

 [[4 9 2]
 [5 1 3]]
  

Я хочу отсортировать нижнюю строку этого массива, но чтобы верхняя строка выполняла сортировку, так что я получаю:

 [[9 2 4]
 [1 3 5]]
  

Я знаю, что вы можете сортировать подобным образом, используя функцию sorted(), но для этого требуется ввод и вывод списков.

Есть идеи? Большое спасибо!

Ответ №1:

 import numpy as np
a = np.array([[4,9,2],[5,1,3]])
idx = np.argsort(a[1])
  

Теперь вы можете использовать idx для индексации вашего массива:

 b=a[:,idx]
  

Комментарии:

1. Потрясающе, большое спасибо! Это решение было намного проще, чем я ожидал. Я читал примеры numpy argsort() и, вероятно, переоценил эту проблему.

Ответ №2:

Единственное (эффективное) решение, о котором я могу думать, требует копии исходного массива.

 import numpy as np
a = np.array([[4,9,2],[5,1,3]])
idx = np.argsort(a[1])
  

Итак, это idx индекс отсортированного столбца.

 c = a.copy()
for i in range(len(idx)):
  a[:,i] = c[:,idx[i]]
  

Это должно быть достаточно быстро, но, конечно, тратит впустую некоторую память.