argsort関数が壊れているようです。 提供されたコードを見ると、行[0、1]のargsortは正しいですが、行[2、3]では混乱しています。
さまざまなNumPyインストールとバージョン1.11.0および1.12.0でこれをテストしました
import numpy as np
vec = np.array([
[-1.4, -1.2, 1.3],
[-3.6, 3.9, -3.7],
[-2.3, 1.5, -2. ],
[-2.6, 2.4, -1.6]
])
In [1]: np.argsort(-vec, axis=1)
Out[1]:
array([[2, 1, 0],
[1, 0, 2],
[1, 2, 0],
[1, 2, 0]])
結果に問題はありませんvec[np.arange(4)[:, np.newaxis], np.argsort(-vec, axis=1)]
を印刷して、見栄えがよいことを確認してください。
これは、「npargsortwrong」の2番目のグーグル結果です。
ドキュメントページの説明は(私には)不明確です。 私はそれが誰かを助けることを期待してここに私自身の説明を追加します:
x = numpy.array([1.48,1.31,0.0,0.8])
print x.argsort()
>[2 3 1 0]
一部の人々は、これが代わりに[3, 2, 0, 1]
を与えることを期待するかもしれません。つまり、ソートされていない配列の0番目の要素は、ソートされた配列の3番目の要素である必要があります。
実際には、 x[np.argsort(x)]
がソートされたリスト、つまり[0.0, 0.8, 1.31, 1.48]
を提供するようなインデックスを提供します。 言い換えると、 [2 3 1 0]
は、ソートされた配列の0番目の要素がソートされていない配列の2番目の要素であることを示しています。
本当に[3, 2, 0, 1]
を出力として取得したい場合は、代わりに次のようにすることができます。
np.argsort(np.argsort(x))
>[3 2 0 1]
あるいは、あなたが私のように本当にオフベースで、たとえば、 x
の3つの最大の要素のインデックスだけが必要な場合:
np.argsort(x)[:-4:-1]
>[0, 1, 3]
本当に[3、2、0、1]を出力として取得したい場合は、代わりに次のようにすることができます。
これを行うとより速くなります:
a = np.empty(len(x), np.intp)
a[np.argsort(x)] = np.arange(len(x))
np.invert_permutation(np.argsort(x))
としてnumpyに追加することを提案しています@ rossbar 、 @ bjnath :おそらく、上記の@ghostのコメントから何かを抽出して、ドキュメントに入れる価値がありますか? 混乱の例をさらに示すために、さらにいくつかのクロスリンクを追加しました。
最も参考になるコメント
これは、「npargsortwrong」の2番目のグーグル結果です。
ドキュメントページの説明は(私には)不明確です。 私はそれが誰かを助けることを期待してここに私自身の説明を追加します:
一部の人々は、これが代わりに
[3, 2, 0, 1]
を与えることを期待するかもしれません。つまり、ソートされていない配列の0番目の要素は、ソートされた配列の3番目の要素である必要があります。実際には、
x[np.argsort(x)]
がソートされたリスト、つまり[0.0, 0.8, 1.31, 1.48]
を提供するようなインデックスを提供します。 言い換えると、[2 3 1 0]
は、ソートされた配列の0番目の要素がソートされていない配列の2番目の要素であることを示しています。本当に
[3, 2, 0, 1]
を出力として取得したい場合は、代わりに次のようにすることができます。あるいは、あなたが私のように本当にオフベースで、たとえば、
x
の3つの最大の要素のインデックスだけが必要な場合: