概要
JSでnumpyのargsortを使いたいと思ったのですが、
参考になる資料がネット上で見つからなかったので、実装しました。
argsortとは
argsortとは、ソートを実際にするのではなく、ソートをした結果の配列のインデックスを返すメソッドです。
例えば、上記のnumpyのargsortのドキュメントでは、
>>> x = np.array([3, 1, 2])
>>> np.argsort(x)
array([1, 2, 0])
とあります。
numpyのsortでは、デフォルトでは昇順に並ぶので、
x = [3, 1, 2] は、 [1 , 2, 3]と並ぶのが正解です。
この、sort後の[1, 2, 3]が、元の配列xで何番目であるかという情報が、argsortで取得できます。
sort後の0番目 = 1 = x[1]
sort後の1番目 = 2 = x[2]
sort後の2番目 = 3 = x[0]
なので、argsortの結果は、[1, 2, 0] となります。
コード
実際に、jsで実装したコードは次の通りです。
function argsort(array) {
const arrayObject = array.map((value, idx) => { return { value, idx }; });
arrayObject.sort((a, b) => {
if (a.value < b.value) {
return -1;
}
if (a.value > b.value) {
return 1;
}
return 0;
});
const argIndices = arrayObject.map(data => data.idx);
return argIndices;
}
console.log(argsort([3, 1, 2])) // => (3) [1, 2, 0]
参考
昇順に並び替えるアルゴリズムは、JavaScript つい忘れてしまう配列のソート方法 さんを参考にしました。
降順でsortをするときのargsortをしたい、などの場合は、上記サイトを参考にargsort内のif文を変えることで変更できます。