Numpy: матрица сортировки, такая как список списков, или: матрица сортировки по строкам - PullRequest
0 голосов
/ 15 октября 2018

У меня есть матрица numpy, которая содержит векторы строк.Я хочу отсортировать матрицу по строкам, как Python отсортировал бы список списков:

import numpy as np
def sortx(a):
    return np.array(sorted([list(i) for i in a]))

a = np.array([[1,4,0,2],[0,2,3,1]])
print(sortx(a))

Вывод:

[[0 2 3 1]
 [1 4 0 2]]

Есть ли numpy эквивалент моего sortx() функция, поэтому мне не нужно конвертировать данные дважды?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вы можете попробовать использовать numpy's lexsort:

a=a[np.lexsort(a[:,::-1].T)]

На моей машине это примерно в четыре раза быстрее, чем ваш sortx метод применительно к матрице 4x4.На матрице из 100 строк разница в скорости еще более значительна.

arr=np.random.randint(0,100,(100,4))
%timeit np.lexsort(arr[:,::-1].T)
#6.29 µs +- 27.1ns
% timeit sortx(arr)
# 112µs +- 1.2µs

Редактировать:

Эндик предложил улучшенную версию sortx() method.

def sortx_andyk(a):
    return np.array(sorted(a.tolist())

Время выполнения этого метода:

%timeit sortx_andryk(arr)
# 43µs +- 169ns
0 голосов
/ 15 октября 2018

Вы можете использовать np.sort(arr, axis=0) В вашем случае

import numpy as np
a = np.array([[1,4,0,2],[0,2,3,1]])
np.sort(a, axis=0)

Редактировать

Я неправильно понял вопрос, хотя у меня нет точного ответа на ваш вопросвопрос, вы могли бы использовать argsort.Это возвращает индексы для сортировки вашего массива.Тем не менее, он делает это только на основе оси.Это можно использовать для сортировки массивов на основе определенного столбца, например, первого.Тогда вы будете использовать его следующим образом:

a = a[a.argsort(axis=0)[:, 0]]

, где [:, 0] указывает столбец, по которому производится сортировка, т.е. [:, n] будет сортировать по n -ому столбцу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...