次のコードを検討してください。
a = np.random.random([5,5])
ind = np.argsort(a、axis = 1)
a_sorted = a [ind]
np.sort(a、axis = 1)
これで、a_sortedとaの両方が1軸に沿ってソートされるはずです。 しかし、形さえもう同じではありません。 a_sortedが(5,5,5)であるのに対し、aは(5,5)のままです。 これが意図された動作である場合、誰かが理由を教えてもらえますか?
argsort()
は正常に機能していますが、インデックス作成は期待どおりに機能しません。
http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced -indexing
これを試して:
a = np.random.random([5,5])
i = np.arange(len(a))[:, np.newaxis]
j = np.argsort(a, axis=1)
a_sorted = a[i, j]
np.sort(a, axis=1)
私も同じように混乱しました。 ドキュメントには具体的に次のように記載されています。
戻り値
index_array:ndarray、int
指定された軸に沿ってa
を並べ替えるインデックスの配列。
つまり、a[index_array]
は、ソートされたa
ます。
これは1D配列にのみ適用されます。 これがNDアレイには当てはまらないことを指定するために、ドキュメントを拡張する必要がありますか?
@lzkelleyはい、ドキュメントを改善するためのパッチは大歓迎です。
@shoyerかっこいい、PRして更新します
実際に出力を使用してND配列をソートする方法の例があればよいでしょう。
a[np.arange(np.shape(a)[0])[:,np.newaxis], np.argsort(a)]
よりも読みやすい解決策があればそれも良いでしょう
たぶん@sebergはそれを彼のインデックス関数の追加の1つにすることができます。
インデックス作成に明らかに適合しているとは思いません。おそらく、ピック関数などの方が簡単に一致します。
新しい機能の場合は+1。
argsort
( sort
とは対照的に)の目的全体がインデックス作成に使用されるのではありませんか?
argsort
は、軸に沿って並べ替えるためのインデックスを提供しますが、実際には、インデックスを使用してその軸に沿って並べ替えるのは、不必要に冗長に思えます。 私が気付いていないもっと簡単な方法がない限り。
ピック機能などは、おそらくより簡単に一致します。
これは#8708です
最も参考になるコメント
実際に出力を使用してND配列をソートする方法の例があればよいでしょう。
a[np.arange(np.shape(a)[0])[:,np.newaxis], np.argsort(a)]
よりも読みやすい解決策があればそれも良いでしょう