2016-03-30 4 views
2

私は今これを修正しようとしていますが、私はこの問題でどこにも行けません。python:要素の範囲に渡ってリストのリストを並べ替える

私は、各リストは0から5までの値で構成され、リストのリスト、持っている:今、私は2番目の最後など、非常に最後の要素で始まるこのリストをソートしたい

[[ 0. 0. 4. 2. 2. 2. 2. 2. 2. 2.] 
[ 0. 0. 1. 2. 3. 3. 3. 3. 3. 3.] 
[ 0. 0. 2. 3. 4. 4. 1. 2. 1. 2.] 
[ 0. 0. 3. 4. 5. 1. 4. 4. 5. 5.] 
... 
[ 0. 0. 5. 3. 3. 3. 4. 3. 4. 3.] 
[ 0. 0. 3. 4. 1. 1. 1. 1. 4. 4.] 
[ 0. 0. 3. 4. 1. 3. 3. 3. 3. 1.] 
[ 0. 0. 1. 4. 4. 5. 3. 4. 3. 1.]] 

を最初にすべての方法、のようなものを得るために:私は仕事にこの要素の範囲を得ることができなかったのに対し、私はオンライン個別の列/要素を扱って見られる配列/リストの質問にソートする

[[ 0. 0. 3. 4. 1. 3. 3. 3. 3. 1.] 
[ 0. 0. 1. 4. 4. 5. 3. 4. 3. 1.] 
[ 0. 0. 5. 3. 3. 3. 3. 3. 4. 1.] 
[ 0. 0. 2. 3. 4. 4. 1. 2. 1. 2.] 
... 
[ 0. 0. 3. 4. 1. 1. 1. 1. 4. 4.] 
[ 0. 0. 3. 3. 3. 4. 4. 4. 4. 4.] 
[ 0. 0. 4. 4. 3. 4. 5. 5. 1. 5.] 
[ 0. 0. 3. 4. 5. 1. 4. 4. 5. 5.]] 

すべての返信を。結局のところ有効な唯一の解決策は次のとおりです。

array = array[np.lexsort((array[:,-9], array[:,-8], array[:,-7], array[:,-6], array[:,-5], array[:,-4], array[:,-3], array[:,-2], array[:,-1]))] 

これは非常に醜いだけでなく、あまり柔軟ではありません。このコマンドをループまたは変数で置き換える試みはすべて悲惨に失敗しました。

ご意見をいただければ幸いです。

答えて

2

あなたは単に入力配列を転置して、そのように、ベクトル化およびので、かなり効率的なソリューションのソートインデックスを取得するためにnp.lexsortを使用することができます -

array[np.lexsort(array[:,1:].T)] 

サンプル実行 - 私はこの次のエラーを取得する

In [128]: # Random array of integers 
    ...: array = np.random.randint(0,9,(5,10)) 
    ...: 
    ...: # Original method 
    ...: A = ((array[:,-9], array[:,-8], array[:,-7], array[:,-6], array[:,-5], \ 
    ...:  array[:,-4], array[:,-3], array[:,-2], array[:,-1])) 
    ...: out_loopy = array[np.lexsort(A)] 
    ...: 
    ...: # Vectorized method 
    ...: out_vectorized = array[np.lexsort(array[:,1:].T)] 
    ...: 

In [129]: np.allclose(out_loopy,out_vectorized) 
Out[129]: True 
+1

これは正しい方法です。 'ソート済み(LoL、key = lambda l:l [:: - 1])'の不規則なバージョン。ありがとう – dawg

2

考える:ものはnumpyの配列の場合ndarray.sortを使用し、

>>> sorted(LoL, key=lambda l: l[::-1]) 
[[0.0, 0.0, 3.0, 4.0, 1.0, 3.0, 3.0, 3.0, 3.0, 1.0], 
[0.0, 0.0, 1.0, 4.0, 4.0, 5.0, 3.0, 4.0, 3.0, 1.0], 
[0.0, 0.0, 2.0, 3.0, 4.0, 4.0, 1.0, 2.0, 1.0, 2.0], 
[0.0, 0.0, 4.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0], 
[0.0, 0.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0], 
[0.0, 0.0, 5.0, 3.0, 3.0, 3.0, 4.0, 3.0, 4.0, 3.0], 
[0.0, 0.0, 3.0, 4.0, 1.0, 1.0, 1.0, 1.0, 4.0, 4.0], 
[0.0, 0.0, 3.0, 4.0, 5.0, 1.0, 4.0, 4.0, 5.0, 5.0]] 

LoL=[[ 0., 0., 4., 2., 2., 2., 2., 2., 2., 2.,], 
[ 0., 0., 1., 2., 3., 3., 3., 3., 3., 3.,], 
[ 0., 0., 2., 3., 4., 4., 1., 2., 1., 2.,], 
[ 0., 0., 3., 4., 5., 1., 4., 4., 5., 5.,], 
[ 0., 0., 5., 3., 3., 3., 4., 3., 4., 3.,], 
[ 0., 0., 3., 4., 1., 1., 1., 1., 4., 4.,], 
[ 0., 0., 3., 4., 1., 3., 3., 3., 3., 1.,], 
[ 0., 0., 1., 4., 4., 5., 3., 4., 3., 1.,]] 

は、キーの機能を使用し

>>> m=np.matrix(LoL) 
>>> m 
array([[ 0., 0., 4., 2., 2., 2., 2., 2., 2., 2.], 
     [ 0., 0., 1., 2., 3., 3., 3., 3., 3., 3.], 
     [ 0., 0., 2., 3., 4., 4., 1., 2., 1., 2.], 
     [ 0., 0., 3., 4., 5., 1., 4., 4., 5., 5.], 
     [ 0., 0., 5., 3., 3., 3., 4., 3., 4., 3.], 
     [ 0., 0., 3., 4., 1., 1., 1., 1., 4., 4.], 
     [ 0., 0., 3., 4., 1., 3., 3., 3., 3., 1.], 
     [ 0., 0., 1., 4., 4., 5., 3., 4., 3., 1.]]) 
>>> m[m[:,-1].argsort()] 
array([[ 0., 0., 3., 4., 1., 3., 3., 3., 3., 1.], 
     [ 0., 0., 1., 4., 4., 5., 3., 4., 3., 1.], 
     [ 0., 0., 4., 2., 2., 2., 2., 2., 2., 2.], 
     [ 0., 0., 2., 3., 4., 4., 1., 2., 1., 2.], 
     [ 0., 0., 1., 2., 3., 3., 3., 3., 3., 3.], 
     [ 0., 0., 5., 3., 3., 3., 4., 3., 4., 3.], 
     [ 0., 0., 3., 4., 1., 1., 1., 1., 4., 4.], 
     [ 0., 0., 3., 4., 5., 1., 4., 4., 5., 5.]]) 
+0

: ValueError:複数の要素を持つ配列の真理値があいまいです。 a.any()またはa.all()を使用します。 私は、.ANYを追加する場合は()、または.ALL()私が手: はTypeError:「numpy.bool_」オブジェクトが反復可能ではありません –

+0

はNP版 – dawg

+0

の編集を参照してください更新をお試しください... – dawg

0

次の並べ替え機能

を使用します
def mysort(list1,list2): 
    i = min(len(list1),len(list2))-1 # in case unequal lines 
    while (i>0) and list1[i]== list2[i]: 
    i -= 1 
    return cmp(list1[i],list2[i]) 
でテスト

(それが正しい答えを出力します)

LL = [[ 0, 0, 4, 2, 2, 2, 2, 2, 2, 2,], 
[ 0, 0, 1, 2, 3, 3, 3, 3, 3, 3,], 
[ 0, 0, 2, 3, 4, 4, 1, 2, 1, 2,], 
[ 0, 0, 3, 4, 5, 1, 4, 4, 5, 5,], 
[ 0, 0, 5, 3, 3, 3, 4, 3, 4, 3,], 
[ 0, 0, 3, 4, 1, 1, 1, 1, 4, 4,], 
[ 0, 0, 3, 4, 1, 3, 3, 3, 3, 1,], 
[ 0, 0, 1, 4, 4, 5, 3, 4, 3, 1,]] 

LL.sort(mysort) 
print (LL) 
+0

サブリストの長さがすべて10であることが本当にわかっているならば、 'i = 9'を使うことができます。しかし、これはコードをより堅牢で多用途にします。 –