web-dev-qa-db-ja.com

Julia一致述語で配列から要素を選択する方法は?

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の配列から述語をどのように選択しますか?

20
Peeter Joot

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
27
DSM

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]
12
jch

辞書のキーをフィルタリングするために、これは私にとってうまくいきました:

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"])

これは一般に、文字列の配列をフィルタリングする優れた方法です。

お役に立てば幸いです。

0
phyatt