2016-05-29 4 views
0

これは何度も尋ねられているようですが、答えは見つからないようです。のは、単純なことしてみましょう、ここで私はnumpy行列のすべての行をtarget-columnで並べ替える

[[1, 0], 
[3, 2], 
[7, 6], 
[5, 7], 
[9, 8]])   

以下のように、第2の列でソート次にnumpyの行列に

data = np.matrix([[9, 8], 
      [7, 6], 
      [5, 7], 
      [3, 2], 
      [1, 0]]) 

を持っている私はPython Matrix sorting via one columnのようにたくさんの例を試みたが、それらのどれも働きました。

答えが何年も前に投稿されていて、最新のPythonでうまくいかないことが考えられますか?私のPythonは3.5.1です。私の失敗した裁判の

例:

data = np.matrix([[9, 8], 
      [7, 6], 
      [5, 7], 
      [3, 2], 
      [1, 0]]) 
temp = data.view(np.ndarray) 
np.lexsort((temp[:, 1],)) 

print(temp) 
print(data) 
+2

"うまくいかない"とはどういう意味ですか、どのコードが正確に試されたのですか?あなたはnp.matrix!= np.arrayを知っていますか? (私は本当に本当に本当に、これらの他の答えは、彼らが基本的なnumpyのものを使用している場合は古いです、これは多くの理由numpyを殺すだろう!) – sascha

+0

あなたの質問で別の一瞥を取っている間:列ごとの行列**は誤解を招きます。あなたの最初のリンクの** working **の例ではそうしていますが、あなたの例によると、(対応する他の列も再配置することなく)行列内の列をソートしたいだけです! – sascha

+0

@サスカあなたは正しいので、私は2番目のリンクを削除しました。 「うまくいきません」とは、承認された回答が行列をソートしないことを意味します。私はそこに例を挙げました。 – Windtalker

答えて

4

あなたは動くターゲットです。各列独立

並び替え:第二カラム

In [160]: ind=np.argsort(data[:,1],axis=0) 

In [161]: ind 
Out[161]: 
matrix([[4], 
     [3], 
     [1], 
     [2], 
     [0]], dtype=int32) 

In [162]: data[ind.ravel(),:] # ravel needed because of matrix 
Out[162]: 
matrix([[[1, 0], 
     [3, 2], 
     [7, 6], 
     [5, 7], 
     [9, 8]]]) 

有効ind配列を取得する別の方法の値に

In [151]: np.sort(data,axis=0) 
Out[151]: 
matrix([[1, 0], 
     [3, 2], 
     [5, 6], 
     [7, 7], 
     [9, 8]]) 

並べ替え:

In [163]: ind=np.argsort(data.A[:,1],axis=0) 

In [164]: ind 
Out[164]: array([4, 3, 1, 2, 0], dtype=int32) 

In [165]: data[ind,:] 

lexsortを使用するには

のようなものが必要です
In [175]: np.lexsort([data.A[:,0],data.A[:,1]]) 
Out[175]: array([4, 3, 1, 2, 0], dtype=int32) 

またはあなたの '失敗' の場合 - ここdata[:,1]

In [178]: np.lexsort((data.A[:,1],)) 
Out[178]: array([4, 3, 1, 2, 0], dtype=int32) 

を失敗しないで主キーです。 data[:,0]はタイ・ブレーカーです(ご使用の例では該当しません)。私はドキュメントから作業しています。

+0

あなたのヒントをすべて拝見してくれました。 – Windtalker

1

アプローチあなたのリンクでは、働いている:

import numpy as np 

data = np.matrix([[9, 8], 
     [7, 6], 
     [5, 7], 
     [3, 2], 
     [1, 0]]) 

print(data[np.argsort(data.A[:, 1])]) 

[[1 0] 
[3 2] 
[7 6] 
[5 7] 
[9 8]] 

そして、それは見た方がよいでしょう、今の例を:

data = np.matrix([[1, 9], 
     [2, 8], 
     [3, 7], 
     [4, 6], 
     [0, 5]]) 
[[0 5] 
[4 6] 
[3 7] 
[2 8] 
[1 9]] 
+0

サチャ、私はあなたの助けと忍耐に感謝します。私は最初の投稿で多くの間違いを犯しました。最も大きな間違いは行列とndarrayで混乱しました。とにかく、もう一度ありがとう。私の問題を解決しました – Windtalker

+0

心配はいりません。 pythonとnumpyで楽しんでみましょう!あなたはまた、@ hpauljの答えを受け入れるべきです。なぜなら、それは本当に詳細であなたの問題を解決するからです! StackOverflowsヘルプを見て、タイトルに「解決済み」が必要ない理由を確認してください。 1つの答えを**受け入れ**とマークするだけです。 – sascha

+0

フラグが立てられました。さて、可能であれば、私はあなたに両方のフラグを付けたいと思います。 – Windtalker

関連する問題