Изменить некоторые элементы массива с помощью маски в 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
Меня особенно интересует наиболее эффективный способ сделать это, потому что реальные массивы, с которыми я работаю, могут быть довольно большими. Спасибо!
2 ответа
Ты можешь использовать 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, обратите внимание, что 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
, чтобы создать желаемую битовую маску.