#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]])