Python Numpy重新排列双向排序

时间:2013-04-12 13:23:55

标签: python sorting 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 个答案:

答案 0 :(得分:3)

您可以使用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'],但现在这对我不起作用。