(63) numpyでソート後配列のインデックスを取得

投稿者: | 2014年9月11日

25,188 views

この記事は最終更新から 1831日 が経過しています。

以下のような乱数配列aを作る。

>>> import numpy as np
>>> a = np.random.rand(10)
>>> a
array([ 0.4556755 ,  0.82176872,  0.49312231,  0.17689834,  0.96413341,
        0.41666999,  0.91981665,  0.26402886,  0.67935056,  0.80891284])

配列要素をソートしたい場合、numpy.sort を使えばよい。

>>> b = np.sort(a)
>>> b
array([ 0.17689834,  0.26402886,  0.41666999,  0.4556755 ,  0.49312231,
        0.67935056,  0.80891284,  0.82176872,  0.91981665,  0.96413341])

降順にしたい場合はソート後の配列をフリップする。
フリップは、最終要素[-1]から-1ずつインデックスをずらすことにより実現する。

>>> c = b[-1::-1]
>>> c
array([ 0.96413341,  0.91981665,  0.82176872,  0.80891284,  0.67935056,
        0.49312231,  0.4556755 ,  0.41666999,  0.26402886,  0.17689834])

本題の ソート後の配列要素インデックスを得るには?numpy.argsort を使う。

>>> x = np.argsort(a)
>>> x
array([3, 7, 5, 0, 2, 8, 9, 1, 6, 4])

得られたインデックスを使用して、配列要素のソートもできる。

>>> a[x]
array([ 0.17689834,  0.26402886,  0.41666999,  0.4556755 ,  0.49312231,
        0.67935056,  0.80891284,  0.82176872,  0.91981665,  0.96413341])
>>> b - a[x]
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

MATLABもそうだけど、これができるのがとっても便利。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です