2016-11-07 36 views
1

我有以下代碼/數據:蟒 - 由2列排序NP 2D陣列(acending,decending)

import numpy as np 

data = np.array([ 
    [12, 1, 0.7, 0], 
    [13, 2, 0.5, 1], 
    [41, 3, 0.3, 0], 
    [20, 2, 0.8, 0], 
    [51, 2, 0.7, 0], 
    [32, 0, 0.9, 0], 
    [17, 4, 0.7, 1], 
    [54, 1, 0.6, 1], 
    [22, 1, 0.4, 1], 
    [74, 0, 0.5, 0], 
    [11, 4, 0.3, 1], 
    [13, 3, 0.8, 0], 
    [15, 4, 0.3, 0], 
    [65, 3, 0.2, 1], 
]) 

我想2D陣列排序:主要由數據[:, 1] acending順序(從低到高),其次,[:,2]在decending順序數據(最高到最低) 所以我想出以下代碼:

data[:, 2] = -data[:, 2] 
ind = np.lexsort((data[:, 2], data[:, 1])) 
data[:, 2] = -data[:, 2] 
data = data[ind] 
print data 

已使得:

[[ 32. 0. 0.9 0. ] 
[ 74. 0. 0.5 0. ] 
[ 12. 1. 0.7 0. ] 
[ 54. 1. 0.6 1. ] 
[ 22. 1. 0.4 1. ] 
[ 20. 2. 0.8 0. ] 
[ 51. 2. 0.7 0. ] 
[ 13. 2. 0.5 1. ] 
[ 13. 3. 0.8 0. ] 
[ 41. 3. 0.3 0. ] 
[ 65. 3. 0.2 1. ] 
[ 17. 4. 0.7 1. ] 
[ 11. 4. 0.3 1. ] 
[ 15. 4. 0.3 0. ]] 

其正確。但我想知道是否有更好的方法來做到這一點。首先如果可以在較短的運行時間內完成。其次,一個更簡單的pytonic代碼。

,使其更短(和更Python),我可以這樣做:

ind = np.lexsort((-data[:, 2], data[:, 1])) 
data = data[ind] 

運行時仍然沒有答案。

+0

[This](http://stackoverflow.com/questions/6835531/sorting-a-python-array-recarray-by-column)可能會有所幫助。 –

回答

1

你可以直接與np.lexsort使用否定的第二列 -

data[np.lexsort((-data[:, 2], data[:, 1]))] 

假設在第一欄和第二欄非負值非負整數,這裏是與argsort替代 -

data[(data[:,1]*(data[:,2].max()+1) - data[:,2]).argsort()] 

如果第二列總是有[0,1)中的元素,我們可以簡單地說一下 -

data[(data[:,1] - data[:,2]).argsort()] 
+0

是的,它好多了。你認爲它是最好的運行時間嗎? –

+0

@EranMoshe第二列總會在[0,1)區間內嗎? – Divakar

+0

嗯在某些情況下,我可以強制它在[0,1) –