Как отсортировать массив 2d numpy по столбцам с наибольшей суммой

#python #numpy-ndarray #columnsorting

Вопрос:

У меня есть 2D массив с формой (35 6004), и я хочу отсортировать его на основе суммы столбцов. Так что, если бы я, например,

 array([[5, 3, 13], 
       [1, 2, 20],
       [6, 2,  6]])
 

Я хочу отсортировать свой массив таким образом

 array([[13, 5, 3], 
       [20, 1, 2],
       [6 , 6, 2]]).
 

Я попытался найти индекс столбца

 def find_max_col(o):
    t = o.sum(axis=0)
    te = t.tolist()
    return te.index(t.max())
 

затем я использую выходные данные этой функции для сортировки массива

 test = array[array[:, find_max_col(array)].argsort()]
 

и сделайте это, чтобы проверить и убедиться, что все прошло успешно

 t1 = test.sum(axis=0)
print(t1)
 

Как я понимаю, если я отсортирую по столбцу с наибольшей суммой, я должен получить массив, который показывает мне суммы всех столбцов в убывающей форме в качестве вывода приведенного выше кода.

Является ли мой код для проверки того, работал ли я неправильно, допустил ли я ошибку при сортировке или я даже не нашел правильный индекс столбца для сортировки?

Ответ №1:

Если вы хотите отсортировать столбцы по убыванию их сумм, сделайте именно это.

 idx = array.sum(axis=0).argsort()[::-1]
print(array[:,idx])
 

Ваш тест верен, и тот факт, что он не дает правильного ответа, означает, что вы ошиблись где-то в другом месте. Поскольку вы хотите отсортировать столбцы, test должно было быть по крайней мере

 test = array[:,array[:, find_max_col(array)].argsort()]
 

Бывает так, что array[:, find_max_col(array)].argsort() для вашего точного примера получается правильный ответ, но по неправильным причинам. Вы вычисляете сортированные индексы столбца с наибольшей суммой, array[:,2] == array([13, 20, 6]) т. е., когда вы должны сортировать индексы сумм столбцов в порядке убывания , т. е., array.sum(axis=0) == array([12, 7, 39]) .

Ответ №2:

Я не уверен, что ваше решение неверно, но оно, безусловно, сложнее, чем необходимо:

 >>> a = np.array([[5, 3, 13],
                  [1, 2, 20],
                  [6, 2,  6]])

>>> a[:, a.sum(axis=0).argsort()]  # sort columns small-to-large
array([[ 3,  5, 13],
       [ 2,  1, 20],
       [ 2,  6,  6]])

>>> a[:, (a.sum(axis=0)*-1).argsort()]  # multiply sums by -1 to sort large-to-small
array([[13,  5,  3],
       [20,  1,  2],
       [ 6,  6,  2]])