2016-11-07 9 views
1

I、次のコード/データを有する:パイソン - (acending降順)2列によってNP 2Dアレイをソート

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], 
]) 

私は2次元配列をソートする:主データでは、[:, 1] acendingでオーダー[:, 2]の順序を降順でのデータ(最高は最低にする) はので、私は次のコードを作ってみた、(最低から最高まで)及び第二:

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. ]] 

その正しい。しかし、私はそれがより良い方法を行うかどうかを知りたいと思います。より短い実行時間で実行することが可能な場合は最初に実行します。二番目に、より簡単なピトニクスコードです。

(ニシキヘビとより多くの)それをさらに短くするために、私はこれを行うことができます。

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

ランタイムは、まだ未解決のまま。あなたが直接np.lexsortと否定第二のカラムを使用することができ

+0

[This(http://stackoverflow.com/questions/6835531/sorting-a-python-array-recarray-by-column)が役に立つかもしれません。 –

答えて

1

-

data[(data[:,1]*(data[:,2].max()+1) - data[:,2]).argsort()] 
- 最初の列と2列目の非負値の非負の整数値を仮定し

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

は、ここにargsortと代替です

第2列の要素が常に[0,1)の場合、単純にビット数を指定できます。

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

はい、はるかに良いです。あなたは最高のランタイムが可能だと思いますか? –

+0

@EranMoshe 2番目の列は常に[0,1]間隔になりますか? – Divakar

+0

いくつかのシナリオでは、[0,1) –

関連する問題