JuliaにはMatlabに似た機能がたくさんあるようです。述語を使用して配列から選択したいのですが。 Matlabではこれを次のように行うことができます:
>> a = 2:7 ;
>> a > 4
ans =
0 0 0 1 1 1
>> a(a>4)
ans =
5 6 7
私はジュリアでこれの一部を行うために一種の不格好に見える方法を見つけました:
Julia> a = 2:7
2:7
Julia> [int(x > 3) for x in a]
6-element Array{Any,1}:
0
0
1
1
1
1
(ウィキペディアが list comprehension と呼ぶものを使用する)。 Juliaでこのようにセットを選択して適用する方法はわかりませんが、間違ったツリーを表示している可能性があります。 Juliaの配列から述語をどのように選択しますか?
elementwise の比較にドット.
を使用すると、非常にMatlabに似た構文を使用できます。
Julia> a = 2:7
2:7
Julia> a .> 4
6-element BitArray{1}:
false
false
false
true
true
true
Julia> a[a .> 4]
3-element Array{Int32,1}:
5
6
7
または、より機能的な述語アプローチが必要な場合は、filter
を呼び出すことができます。
Julia> filter(x -> x > 4, a)
3-element Array{Int32,1}:
5
6
7
Juliaの配列内包表記は、HaskellやPythonのリスト内包表記よりもやや原始的です。 2つの解決策があります—より高次のフィルタリング関数を使用するか、ブロードキャスト操作を使用できます。
filter(x -> x > 4, a)
これはfilter
関数を述語x -> x > 4
で呼び出します(Juliaマニュアルの無名関数を参照)。
a[Bool[a[i] > 4 for i = 1:length(a)]]
これは、a
と4の要素間のブロードキャスト比較を実行し、結果のブール値の配列を使用してa
にインデックスを付けます。ブロードキャストオペレーターを使用して、よりコンパクトに記述できます。
a[a .> 4]
辞書のキーをフィルタリングするために、これは私にとってうまくいきました:
mydict = Dict("key1" => 1.0, "key2" => 2.0, "a big string with a part of a string" => 3.0)
filter(x -> occursin("part of a string", string(x)), keys(mydict))
Julia 1.0のREPLでの出力は次のようになります。
Julia> mydict = Dict("key1" => 1.0, "key2" => 2.0, "a big string with a part of a string" => 3.0)
Dict{String,Float64} with 3 entries:
"key2" => 2.0
"key1" => 1.0
"a big string with a part of a string" => 3.0
Julia> filter(x -> occursin("part of a string", string(x)), keys(mydict))
Set(["a big string with a part of a string"])
これは一般に、文字列の配列をフィルタリングする優れた方法です。
お役に立てば幸いです。