Ruby
Python

numpy.argsort を Ruby で

numpy.argsort() は配列のソート後の値の代わりに、ソート前のインデックスを返す。

>>> import numpy as np

>>> ary = np.array([30, 10, 20])
>>> ary.argsort()
array([1, 2, 0])

これと同様のことを Ruby で行うと

[30, 10, 20].each_with_index.sort_by { |n, _i| n }.map { |_n, i| i }

#=> [1, 2, 0]

# シンプルに書きたいなら
[30, 10, 20].each_with_index.sort.map(&:last)
#=> [1, 2, 0]

ちなみに numpy.argsort() を 2 回繰り返すと、配列内の値の小ささのランキングを取得できる。

>>> ary = np.array([30, 10, 20])

>>> ary.argsort().argsort()
array([2, 0, 1])

これと同様のことを Ruby で行うと

[30, 10, 20]

.each_with_index.sort_by { |n, _i| n }
.each_with_index.sort_by { |(_n, i), _rank| i }
.map { |(_n, _i), rank| rank }
#=> [2, 0, 1]

# シンプルに書きたいなら
ary = [30, 10, 20]
sorted = ary.sort
ary.map { |n| sorted.index(n) }
#=> [2, 0, 1]