Как я могу отсортировать двумерный массив Numey таким конкретным способом - PullRequest
2 голосов
/ 11 марта 2019

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

У меня есть массив, подобный этому:

array([[1,0,1,],
    [0,0,1],
    [1,1,1],
    [1,1,0]])

Я хочу отсортировать строки, сохраняя порядок в строкахтот же самый.Поэтому я ожидаю следующий вывод:

array([[0,0,1,],
    [1,0,1],
    [1,1,0],
    [1,1,1]])

1 Ответ

3 голосов
/ 11 марта 2019

Вы можете использовать dot и argsort:

a[a.dot(2**np.arange(a.shape[1])[::-1]).argsort()]
# array([[0, 0, 1],
#        [1, 0, 1],
#        [1, 1, 0],
#        [1, 1, 1]])

Идея состоит в том, чтобы преобразовать строки в целые числа.

a.dot(2**np.arange(a.shape[1])[::-1])
# array([5, 1, 7, 6])

Затем найдите отсортированные индексы и используйте их для изменения порядка a:

a.dot(2**np.arange(a.shape[1])[::-1]).argsort()
# array([1, 0, 3, 2])

Мои тесты показывают, что это немного быстрее, чем lexsort.

a = a.repeat(1000, axis=0)

%timeit a[np.lexsort(a.T[::-1])]
%timeit a[a.dot(2**np.arange(a.shape[1])[::-1]).argsort()]

230 µs ± 18.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
192 µs ± 4.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Проверить правильность:

np.array_equal(a[a.dot(2**np.arange(a.shape[1])[::-1]).argsort()], 
               a[np.lexsort(a.T[::-1])])
# True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...