ジュリアのfind関数들
概要
ジュリアの基本組み込み関数は知れば知るほど便利だ。早速、例を見て学ぼう。
コード
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