Juliaのfind関数들
概要
Juliaの基本組み込み関数は知れば知るほど便利だ。早速、例を見て学ぼう。
コード
x = [3, 7, 4, 5, 10, 3, 12, 3, 2, 4]
argmin(x)
argmax(x)
findmin(x)
findmax(x)
extrema(x)
findfirst(x .== 3)
findlast(x .== 3)
findall(x .== 3)
findnext(x .== 3, 5)
findprev(x .== 3, 5)
最適解 argmin(),argmax(),findmin(),findmax(),extrema()
最適解を見つける。
x = [3, 7, 4, 5, 10, 3, 12, 3, 2, 4]
julia> argmin(x)
9
julia> argmax(x)
7
y = [7, 8, 9, 9, 7, 9]
julia> argmax(y)
3
julia> findall(y.==maximum(y))
3-element Vector{Int64}:
 3
 4
 6
argmin(),argmax() はただの最適解、つまり値が最も大きく小さい場所のインデックスを返す。そんなインデックスが複数ある場合は最も小さいものを返す。だから、実際は argmax(x) $= \min(\argmax(x))$だ。本当の$\argmax$は、maximum() と下の findall() 関数と一緒に使えばいい。
x = [3, 7, 4, 5, 10, 3, 12, 3, 2, 4]
julia> findmin(x)
(2, 9)
julia> findmax(x)
(12, 7)
findmin(),findmax() は最適解とその値まで返す。
x = [3, 7, 4, 5, 10, 3, 12, 3, 2, 4]
julia> extrema(x)
(2, 12)
ちなみに extrema() はインデックスではなく、その値だけを返す。これは R の range() 関数と同じだ1。
条件を満たした最初・最後のインデックス findfirst(), findlast()
x = [3, 7, 4, 5, 10, 3, 12, 3, 2, 4]
julia> findfirst(x .== 3)
1
julia> findlast(x .== 3)
8
3が存在する最初と最後のインデックスを見つけた。配列の形が大まかに予想できる場合、これらを使ってコードの速度を向上させることができるだろう。
条件を満たした全てのインデックス findall()
x = [3, 7, 4, 5, 10, 3, 12, 3, 2, 4]
julia> findall(x .== 3)
3-element Vector{Int64}:
 1
 6
 8
使いやすく、一般的なプログラミングで最も役に立つ関数だ。maximum(), minimum()と一緒に使えば、全ての $\text{argmin}
条件を満たした特定範囲のインデックス findnext(), findprev()
julia> findnext(x .== 3, 5)
6
julia> findprev(x .== 3, 5)
1
前後である程度は例外として検索する必要がある時もある。例えば、配列の最初の要素と同じ要素を探す時にfindall()を使うと、その最初の要素も見つかってしまうので、煩わしいことになるかもしれない。
環境
- OS: Windows
 - julia: v1.7.0
 
