60575


Ruby勉強中の者です．

配列に対して，ある値（実数）以上の場合は配列の要素から取り除きたいです．  
簡潔に記述したいのですが，どのようにしたら良いでしょうか

ご教授よろしくお願いします  
以下では整数を例としています

[code]

    threshold = 35
    arr = [1, 5, 39, 43, 22, 51]
    arr_s = arr.sort  # 昇順にソート
    # 以降で，threshold 以上の場合配列から取り除く
    # => [1, 5, 22]
    
[/code]


CC BY-SA 4.0
2019-11-16T04:54:50.923
60574
2019-11-17T03:18:21.627
30173
question
ruby
配列に対して，ある値以上の場合は配列の要素から取り除きたい

[code]

    arr_s.reject { |x| x >= threshold }
    
[/code]

または

[code]

    arr_s.take_while { |x| x < threshold }
    
[/code]


CC BY-SA 4.0
2019-11-16T05:02:58.880
60575
2019-11-16T05:02:58.880
2599
60574
answer


プログラムの都合上、ソート済みのものについて高速に処理したいということであれば、  
二分探索のメソッドがあるので、それで閾値のindexを取得すれば以下のように記述できます。

[code]

    index = arr_s.bsearch_index { |x| x >= threshold }
    arr_s.slice(0, index || arr_s.size)
    
[/code]

`reject` などを使えば、ソート済みの配列でなくても要素の選別ができます。

FYI: <https://docs.ruby-lang.org/ja/latest/method/Array/i/bsearch.html>


CC BY-SA 4.0
2019-11-16T10:24:09.730
60583
2019-11-16T10:24:09.730
36655
60574
answer


NArrayなら

[code]

    require 'numo/narray'
    
    arr = Numo::Int32[1, 5, 39, 43, 22, 51]
    arr[arr < 35]
    
    # => Numo::Int32(view)#shape=[3]
    # [1, 5, 22]
    
[/code]

ですね。


CC BY-SA 4.0
2019-11-17T03:18:21.627
60600
2019-11-17T03:18:21.627
32772
60574
answer