Самый простой способ сделать это - использовать параметр order
, равный sort
sort(data, order=['value', 'class'])
Однако для запуска на моем компьютере требуется 121 мс, в то время как для data['class']
и data['value']
требуется всего 2,44 и 5,06 мс соответственно. Интересно, что sort(data, order='class')
снова занимает 135 мс, что указывает на проблему с сортировкой структурированных массивов.
Итак, вы выбрали сортировку каждого поля с использованием argsort
, а затем индексирование окончательного массива, похоже, на правильном пути. Однако вам нужно отсортировать каждое поле отдельно,
idx=argsort(data['class'])
data_sorted = data[idx][argsort(data['value'][idx], kind='stable')]
Это выполняется за 43,9 мс.
Вы можете получить очень небольшое ускорение, удалив один временный массив из индексации
idx = argsort(data['class'])
tmp = data[idx]
data_sorted = tmp[argsort(tmp['value'], kind='stable')]
Который работает за 40,8 мс. Не здорово, но это обходной путь, если производительность критична.
Кажется, это известная проблема:
очень медленная сортировка структурированных и записанных массивов
Редактировать
Исходный код для сравнений, используемых в сортировке, можно увидеть по https://github.com/numpy/numpy/blob/dea85807c258ded3f75528cce2a444468de93bc1/numpy/core/src/multiarray/arraytypes.c.src.
Числовые типы намного, намного проще. Тем не менее, такая большая разница в производительности удивительна.