2016-09-14 16 views
1

私はPythonのNumpyにMATLABコードを移植しています。 MATLAB(実際オクターブ)ではMATLAB sort()とNumpy argsort() - 結果のマッチング方法は?

、私のような何かをしている:だからnumpyの中で、私は

>> someArr = [9, 8, 7, 7] 
>> [~, ans] = sort(someArr, 'descend') 
    ans = 
    1 2 3 4 

をやってる:

>>> someArr = np.array([9, 8, 7, 7]) 
>>> np.argsort(someArr)[::-1] 
array([0, 1, 3, 2]) 

をnumpyの上0, 1, 3, 2ながら、私はMATLABで1, 2, 3, 4を得て、 Numpyに0, 1, 2, 3が必要です。

私はそれが各機能で使用されているソートアルゴリズムのためだと信じていましたが、チェックしたところ、どちらも「クイックソート」(herehere参照)を使用しているようです。

は、どのように私はMATLABのいずれかにnumpyののソリューションを一致させることができますか?

+0

達成しようとしていることは何ですか?ゼロインデックス作成から1インデックス作成に進むことができます。逆の順序はソートアルゴリズムでは起こりえないことは期待できません。 – CodeMonkey

+0

申し訳ありませんが、私は自分の質問を編集しました。 0インデックスから1インデックスまでは私にとって重要ではなく、インデックスの順序だけです。 – galah92

答えて

4

この作品を作るために、我々は少し賢いする必要があります。 numpyにはアナログの'descend'がありません。ソートの結果を逆にすることで模倣しています(これは最終的に元に戻しています)。

私はmatlabがそれを達成かどうかはわかりませんが、彼らはstable variant of quicksortを使用することを主張します。特に、降順の場合:

フラグが 'descend'の場合、出力は返される直前に反転されます。逆転後、安定性を回復するためにインデックスベクトルのソートを実行しました。

ここにはoctaveが続きます。

そのソートは安定しているので、あなたが入力中に同じ値の順序が出力に保存されることを保証しています。一方、numpyはクイックソートの保証はしていません。我々はnumpyの中で安定した並べ替えをしたい場合、我々はmergesortを使用する必要があります。

>>> np.argsort(someArr, kind='mergesort') 
array([2, 3, 1, 0]) 

[OK]を、この出力は理にかなっています。 (ソートアルゴリズム保証安定せず、私たちはこの主張を作ることができなかった)2が出力に3前だろうと賢明であるようsomeArr[2] == someArr[3]と第三の要素は、第四の前に来ます。今すぐ賢いステップが来る...あなたは "降順"の値を欲しいですが、argsortの出力を反転するのではなく、入力を否定するのはなぜですか?それは今、私たちはtalkinのだ...

>>> np.argsort(-someArr, kind='quicksort') 
array([0, 1, 2, 3]) 

を降順の並べ替えを行うと同じように自分の下の対応よりも前にソートより多くの効果があります!そして、mergesortは安定していることが保証されているので、より低いインデックスに現れる要素(等しい値を持つ)が最初に出力に表示されます - ちょうどmatlab/octaveのように。ニース。

+0

素晴らしい!ありがとう!私は完全に理解していませんが、動作します。入力配列の無効化がソートにどのように影響するのかを指定してください。 – galah92

+0

このように考えてみましょう。 '[3、2、5、7、9]'という配列を持ち、降順に並べ替えると( 'sorted(array、reverse = True)') [9、7、5、3、2]。しかし、もしあなたが 'sorted(array、key = lambda x:-x)'ならば、その結果を得るでしょう。ここでも同じことをしています... 'argsort'は基本的に値を返すキー関数を持つインデックスの一種です。値を無効にすると、前の例と同様にソートが逆になります。 – mgilson

+0

もちろん、 'np.argsort(-someArr)'と 'np.argsort(someArr)[:: - 1]'が異なる結果をもたらすのはなぜですか? – galah92

0

さまざまなソートアルゴリズムを選択できます。私のために働いたheapsortにそれを変更する:

>> np.argsort(someArr, kind="heapsort")[::-1] 
array([0, 1, 2, 3], dtype=int32) 

編集:私は見ていくつかのテストケースでしか動作。 [9, 8, 7, 7, 4, 1, 1]の場合、動作を停止します。私の答えはおそらく良い解決策ではありません。

+0

_this_入力では動作するかもしれませんが、_all_入力で動作するようにはなっていません。 – mgilson

+0

これは本当です、私は答えを編集し、これは良い解決策ではないと言うでしょう。 – Ian

関連する問題