2017-01-16 9 views
1

Juliaの配列の一部のメンバーに対してのみ操作を実行したい。言語に慣れていないし、何をすべきかわからないJuliaでマスクを使用して配列の要素を変更する

myarray = ones(5) 
mymask = [true; false; false; false; true;] 
myarray = myarray[mymask] * 2 

3行目は右ではない、出力は次のとおりです:

2-element Array{Float64,1}: 
2.0 
2.0 

私は何を取得したいことは次のとおりです。

5-element Array{Float64,1}: 
2.0 
1.0 
1.0 
1.0 
2.0 

私は特にだこれが私の小さなおもちゃのテストですこれを行う最も効率的な方法に興味があります。私が実際に使っている配列がかなり大きいかもしれないからです。ありがとう!

答えて

3

myarray[mask]を左側にターゲットとして使用し、右側に割り当てまたは操作を行うことができます。たとえば:今

julia> myarray[mymask] = 2; 

julia> myarray[~mymask] *= 3; 

julia> myarray 
5-element Array{Float64,1}: 
2.0 
3.0 
3.0 
3.0 
2.0 

myarray = myarray[mymask] * 2で、あなたが得られた修飾語の配列にmyarrayを設定しています。 DSMの答えを補完

+0

ありがとうございます。だから私がこの例でしたいのは、 'myarray [mymask] = myarray [mymask] * 2'です。ありがとう! –

+0

@BenS: 'myarray [mymask]'を繰り返す必要はないので、 '* = 3'の例を挙げました。 – DSM

2

BitArrayはおそらくBoolコンポーネントの配列よりもあなたの目的のために、より多くのメモリ効率的であることに注意してください。

p = 2000 
x = Array{Bool,1}(p) # e.g. [true; false; ...; true] 
y = trues(p)   # BitArray 

は大きさの比較:

julia> sizeof(x) 
2000 

julia> sizeof(y) 
256 

あなたがしてyを埋めることができ必要に応じてfalseを入力します。 y[1] = false、希望のビットマスクを作成します。

関連する問題