57631


配列arrayに対して変数inputの値に最も近いk個のarrayの要素を取得できるメソッドが作りたいですが，方法がわかりません．  
質問タイトルだけではよくわからないと思うので，以下の例を提示します．

配列`array`を以下と仮に定義する

[code]

    array = [1.3, 1.4, 6.3, 2.9, 3.0]
    
[/code]

ここで，`input`を以下と仮に定義する

[code]

    input = 3.5
    
[/code]

このとき，`k = 3`とすると`array`の要素で`input`に最も近い値3つは，

[code]

    1.4, 2.9, 3.0
    
[/code]

なので，返り値として，`[1, 3, 4]`をとる．  
このようなメソッドを作りたいですが，わかりません．  
どなたかご教授よろしくお願いいたします．


CC BY-SA 4.0
2019-08-27T06:11:49.113
57629
2019-08-29T04:05:13.667
2019-08-27T06:43:54.000
2599
30173
question
ruby
配列arrayに対して変数inputの値に最も近いk個のarrayの要素のインデックスを取得したい


要素の値を取るならこれで

[code]

        array = [1.3, 1.4, 6.3, 2.9, 3.0]
        input = 3.5
        k = 3
        p array.min_by(k) { |x, _| (input - x).abs }
        # [3.0, 2.9, 1.4]
    
[/code]

インデックスであれば

[code]

        array = [1.3, 1.4, 6.3, 2.9, 3.0]
        input = 3.5
        k = 3
        p array.each_with_index.min_by(k) { |x, _| (input - x).abs }.map(&:last)
        # [4, 3, 1]
    
[/code]

でどうでしょう


CC BY-SA 4.0
2019-08-27T06:39:01.947
57631
2019-08-27T06:44:15.023
2019-08-27T06:44:15.023
2599
2599
57629
answer


NArrayでは、ぱっと思いつくのは

[code]

    require 'numo/narray'
    
    na = Numo::SFloat[1.3, 1.4, 6.3, 2.9, 3.0]
    idx = (na - 3.5).abs.sort_index
    # [4, 3, 1, 0, 2]
    
    na[idx]
    # [3, 2.9, 1.4, 1.3, 6.3]
    
    na[idx[0..2]]
    # [3, 2.9, 1.4]
    
[/code]

ですね。`abs` は絶対値です。オリジナルの配列における順番にこだわりがあるなら、

[code]

    idx[0..2].sort
    # [1, 3, 4]
    
[/code]

です。


CC BY-SA 4.0
2019-08-29T04:05:13.667
57679
2019-08-29T04:05:13.667
32772
57629
answer