2017-03-20 11 views
3

私はnumpyの配列を持っている:numpyのargsortは、ネクタイのインデックスを下げることができますか?

foo = array([3, 1, 4, 0, 1, 0]) 

は私がトップ3のアイテムが欲しいです。

foo.argsort()[::-1][:3] 

戻り

array([2, 0, 4]) 

を呼び出すお知らせfoo[1]値とfoo[4]は等しいので、numpy.argsort()は配列の最後に表示された項目のインデックスを返すことによってタイを処理します。私のアプリケーションの場合、すなわち指数4.

私はタイブレイクは、配列(ここでは、インデックス1)の最初に表示される項目のインデックスを返したいです。これを効率的に実装するにはどうしたらいいですか?

答えて

3

これはどうですか?

(-foo).argsort(kind='mergesort')[:3] 

この動作理由:

Argsortingを降順には(np.argsortはしないもの)、反対の値(何np.argsortない)の昇順にargsortingと同じです。最初の3つのソートされたインデックスを選択するだけです。今すぐ必要なのは、並べ替えが安定していることを確認することです。つまり、最初のインデックスを最初に維持します。 注:私はデフォルトkind=quicksortが安定していたと思ったが、ドキュメントから、それだけkind=mergesortが安定していることが保証されて表示されます(https://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html

様々なソートアルゴリズムは、その平均速度、最悪のパフォーマンス、作業スペースを特徴としていますサイズ、およびそれらが安定しているかどうか。安定したソートでは、同じキーを持つアイテムが同じ相対順序で保持されます。

'クイックソート、' 1はO(n^2)0なし

'マージソート' 2 O(N *ログ(安定

種類のスピード最悪の作業スペース:利用可能な3つのアルゴリズムは、以下の特性を持っていますN))〜N/2はい

'ヒープソート' N 3 O(n個の*ログ())0なし

+0

あなたは説明していただけますか? – whizvids

+0

編集をご覧ください。 – Julien

0

これは非常にハック答えですが、なぜあなただ​​けの配列をargsortません逆に?こうすることで、argsortは最初のインデックスである最後のインデックスを(逆順に)選択します。

これは、に変換します。この作業の理由

>>> foo = np.array([3, 1, 4, 0, 1, 0]) 
>>> foo.argsort()[::-1] 
array([2, 0, 4, 1, 5, 3]) 
>>> foo.size - 1 - foo[::-1].argsort()[::-1] 
array([2, 0, 1, 4, 3, 5]) 
関連する問題