2013-04-12 53 views
4

我有一个结构化的numpy数组,我按顺序对它进行排序。 它工作得很好,但只在一个方向!Python Numpy Recarray排序双向

降序:

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降序排列,等等......我该怎么做?

谢谢

+0

嗨。 谢谢大家,但我已经找到了解决方案!这非常简单! :) 当指定我的信号的类型,如果一种类型是int我可以指定 i8升序。 – user2209128

+1

尝试'key ='参数。 –

+0

@ user2209128你可以回答你自己的问题。 – askewchan

回答

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'],但那现在不适合我。