Изменить некоторые элементы массива с помощью маски в 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, чтобы создать желаемую битовую маску.

Другие вопросы по тегам