2017-01-16 3 views
1

Я хочу выполнить операцию только для некоторых элементов массива в Julia. Новое на языке и не уверен, что делать. Это мой маленький тест игрушка:Измените некоторые элементы массива с помощью маски в Julia

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

Третья строка не является правильным, выход:

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 в массив полученных измененных условий.

+0

О, хорошо. Так что я хочу сделать в этом примере: 'myarray [mymask] = myarray [mymask] * 2'. Благодаря! –

+0

@BenS: вам не нужно повторять 'myarray [mymask]', поэтому я дал пример '* = 3'. – DSM

2

Дополняя ответ в DSM, обратите внимание, что 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 s при необходимости, например y[1] = false, чтобы создать желаемую битовую маску.