Python Numpy Recarray сортировать двунаправленный

У меня есть структурированный массив NumPy, и я сортирую его по порядку. Это работает довольно хорошо, но только в одном направлении!

По убыванию:

sort(myStructuredArray,order=my_order)[::-1]

а также

По возрастанию:

sort(myStructuredArray,order=my_order)

Порядок my_order это что-то вроде [col1,col2,-col3,col4,-col5,...,colN] и для некоторых столбцов я хотел бы заказать его по возрастанию, например, col1, col2 и colN, а для других - по убыванию col3 и col5 (минус сигнал) . В этом примере я хотел бы отсортировать массив сначала по возрастанию col1, затем по возрастанию col2, затем по убыванию col3, затем по возрастанию col4, затем по убыванию col5 и так далее... Как я могу это сделать?

Спасибо

1 ответ

Решение

Вы можете сделать это с numpy.lexsort

In [1]: import numpy as np
In [2]: a = np.array([(4,0), (1,9), (1,0), (4,9)],
                     dtype=[('x',int),('y',float)])

In [3]: a
Out[3]: 
array([(4, 0.0), (1, 9.0), (1, 0.0), (4, 9.0)], 
      dtype=[('x', '<i8'), ('y', '<f8')])

In [4]: a['x']
Out[4]: array([4, 1, 1, 4])

In [5]: a['y']
Out[5]: array([ 0.,  9.,  0.,  9.])

Порядок приоритетов аргументов для lexsort противоположны np.sort(..., order=...), Итак, сначала отсортировать по убыванию 'x' а затем по возрастанию 'y':

In [6]: a[np.lexsort((a['y'], -a['x']))]
Out[6]: 
array([(4, 0.0), (4, 9.0), (1, 0.0), (1, 9.0)], 
      dtype=[('x', '<i8'), ('y', '<f8')])

Заметки:

  • Это работает, предполагая, что все ваши значения являются числовыми (так как отрицательный не изменит сортировку строк).
  • Я видел где-то использование a['x'][::-1] в качестве ключа вместо -a['x'] но это не работает для меня прямо сейчас.
Другие вопросы по тегам