ジュリアでのラムダ式
概要
Juliaでは、ラムダ式は以下のように定義される。
(x -> 3x^2 - 2x + 3)(1)
これは、匿名関数$\lambda : \mathbb{Z} \to \mathbb{Z}$を定義し、そこに$1$を代入して、$4$という関数値を得たものに相当する。 $$ \lambda : x \mapsto ( 3 x^{2} - 2 x + 3 ) \\ \lambda (1) = 4 $$ 実際、ラムダ式自体はJuliaの特徴ではなく、MATLABやPythonを含む関数型言語に影響を受けて、ほぼ自然にサポートされているもので、Juliaに興味を持つ学習者ならすでにラムダ式を使った経験が多いかもしれない。しかし、これまで使ってきた「それ」がラムダ式であるかどうか知らなかったり、まだその真の価値を知らない読者のために、特にすぐに適用できるであろう例を2つ紹介する。
例1:リストを異なる尺度でソート
リストをソートするのは組み込み関数を使えば非常に簡単だが、多次元配列でカテゴリー別に優先度を設定してソーティングしたり、元のデータを異なる基準でソートしたい場合がある。そんな時は、sort()関数のbyオプションに該当する関数をラムダ式として入れることで、簡単にコードを書くことができる。
julia> # Example 1
julia> example = rand(-20:20,10)
10-element Array{Int64,1}:
3
8
19
-12
-20
9
-13
19
13
2
julia> sort(example, by=(x -> abs(x)))
10-element Array{Int64,1}:
2
3
8
9
-12
-13
13
19
19
-20
上記の作業は、ランダムに選ばれた整数を絶対値が小さいものから大きいものに基づいてソートすることを示している。ラムダ式がなくても不可能ではないが、思ったより単純ではない。与えられたラムダ式(x -> abs(x))を上手く変えれば、コーダーが望むコードを簡単に書くことができるだろう。
例1の応用
valueという辞書が以下のように作成されているとする。
この時、辞書の値の大きさ順でソートするコードは、ラムダ式を活用してsort(value,by=(x -> value[x]))
のように簡単に組むことができ、その実行結果は以下の通りだ。
例2:リストの頻度計算
Rのようにデータを最優先にする言語では、最初から組み込み関数で作られているが、この頻度計算が思うほど単純ではない。アルゴリズムと呼べるほど複雑な作業ではないが、実際にやってみるとかなり手がかかる。これもまた、ラムダ関数を利用して簡単に解決できる!
julia> # Example 2
julia> example = rand(1:3,10); println(example)
[3, 1, 2, 2, 3, 2, 3, 1, 3, 3]
julia> uexample = sort(unique(example))
3-element Array{Int64,1}:
1
2
3
julia> counts = map(x->count(y->x==y,example),uexample)
3-element Array{Int64,1}:
2
3
5
上記の作業は、ランダムに選ばれた整数の頻度を数えたものである。unique()でデータの階級を把握し、それぞれの階級に該当する要素をカウントする方式で、単純に問題を解決した。
環境
- OS: Windows
- julia: v1.5.0