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']
но это не работает для меня прямо сейчас.