4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaScriptでnumpyのargsortを実装する

Last updated at Posted at 2017-11-27

概要

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文を変えることで変更できます。

4
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?