Если вы хотите отсортировать ndarray по отдельным столбцам, используя np.argsort
Учитывая следующую матрицу:
m = np.array([[5., 0.1, 3.4],
[7., 0.3, 6.8],
[3., 0.2, 5.6]])
Этот код сортирует матрицу mна основе столбца 0:
m[m[:,0].argsort(kind='mergesort')]
Результат:
array([[3. , 0.2, 5.6],
[5. , 0.1, 3.4],
[7. , 0.3, 6.8]])
Если вы хотите отсортировать ndarray по нескольким столбцам, используя np.lexsort
Дано:
a = np.array([[1,20,200], [1,30,100], [1,10,300]])
array([[ 1, 20, 200],
[ 1, 30, 100],
[ 1, 10, 300]])
Порядок по столбцу 1 и столбцу 0:
a[np.lexsort((a[:,0],a[:,1]))]
# output:
array([[ 1, 10, 300],
[ 1, 20, 200],
[ 1, 30, 100]])
ПРИМЕЧАНИЕ : последний правый столбец (или строка, если keys - это двумерный массив) - первичный ключ сортировки.
Порядок по всем столбцам (начиная справа):
a[np.lexsort((a[:,0], a[:,1],a[:,2]))]
# output:
array([[ 1, 30, 100],
[ 1, 20, 200],
[ 1, 10, 300]])
Или, что то же самое, порядок по всем столбцам без указаниястолбцы вручную (следуя порядку столбцов в матрице, начиная справа):
a[np.lexsort(list(map(tuple,np.column_stack(a))))]
# output:
array([[ 1, 30, 100],
[ 1, 20, 200],
[ 1, 10, 300]])
Другой вариант: Панды - хорошая идея для вашей конкретной проблемы?
Другой вариант -переключиться на панд.Это работает, но это на порядок медленнее.Вот некоторые тесты на время выполнения:
Данные теста:
a = np.array([[1,20,200]*1000, [1,30,100]*1000, [1,10,300]*1000])
Версия Pandas:
%%timeit
pd.DataFrame(a).sort_values(list(range(a.shape[1]))).values
# 3.66 s ± 110 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Версия Numpy:
%%timeit
a[np.lexsort((a[:,0], a[:,1],a[:,2]))]
# 39.6 µs ± 12.1 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Как вы можете видеть, вы переходите от микросекунд numpy к секундам версии, основанной на пандах (примерно в 1 миллион раз медленнее).
Выбор за вами:)