2013-04-12 51 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'],但那現在不適合我。