Получение странных результатов от NumPy Argsort - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть (как мне кажется) довольно четкий пример с бесформенным аргументом, где он дает странные результаты.Если я создаю пример массива символов:

letters = np.array([['b','a','c'],
                    ['c','a','b'],
                    ['b','c','a']]).astype(str)

, то я ищу сортировку по строкам (и сохранить последовательность сортировки для другого использования позже).Выходные данные, которые я получаю из argsort, равны

sort_seq = np.argsort(letters, axis=1)
sort_seq
array([[1, 0, 2],
       [1, 2, 0],
       [2, 0, 1]])

Кажется, это правильно для первого ряда, но не для остальных.Если я использую его для восстановления массива, то получаю:

output = np.full_like(letters, '')
np.put_along_axis(output, sort_seq, letters,axis=1)
output

, что дает

array([['a', 'b', 'c'],
       ['b', 'c', 'a'],
       ['c', 'a', 'b']], dtype='<U1')

Если я смотрю здесь и на других сайтах, я вижу, что argsorting для многомерных массивоввременами не всегда работал хорошо.Но этот пример кажется очень похожим на тот, что приведен в пустой документации - наверняка, он должен работать в этом случае?

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 13 февраля 2019

Хорошо выглядит для меня:

In [88]: letters = np.array([['b','a','c'],
    ...:                     ['c','a','b'],
    ...:                     ['b','c','a']]).astype(str)
    ...: sort_seq = np.argsort(letters, axis=1)
    ...:                     
In [89]: np.take_along_axis(letters, sort_seq, axis=1)
Out[89]: 
array([['a', 'b', 'c'],
       ['a', 'b', 'c'],
       ['a', 'b', 'c']], dtype='<U1')

Это может быть вопрос о том, как мы понимаем argsort.Это ордер на покупку или на продажу?

Чтобы использовать put, мы должны использовать двойную сортировку

In [91]: dblsort= np.argsort(sort_seq, axis=1)
In [92]: dblsort
Out[92]: 
array([[1, 0, 2],
       [2, 0, 1],
       [1, 2, 0]])
In [93]: res = np.zeros_like(letters)
In [94]: np.put_along_axis(res, dblsort, letters, axis=1)
In [95]: res
Out[95]: 
array([['a', 'b', 'c'],
       ['a', 'b', 'c'],
       ['a', 'b', 'c']], dtype='<U1')

numpy: найти индекс вотсортированный массив (эффективным способом)

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