假设我有一个像这样的一维数组:
julia> myarray = ones(6)
6-element Array{Float64,1}:
1.0
1.0
1.0
1.0
1.0
1.0
我制作了一个掩码,它将选择一些元素,本例中的第一个和第二个元素:
julia> mymask = [true; true; false; false; false; false;]
6-element Array{Bool,1}:
true
true
false
false
false
false
现在我想将第一个和第二个元素乘以从同一个分布中抽取的随机数,并将结果保存在旧数组上。但是这会将它们乘以相同的值:
julia> myarray[mymask] = myarray[mymask] * rand(Normal(20,5))
julia> myarray
6-element Array{Float64,1}:
16.5642
16.5642
1.0
1.0
1.0
1.0
我的下一个想法是尝试myarray[mymask] = myarray[mymask] * rand(Normal(20,5),2)
,但它会出错。
答案 0 :(得分:5)
您可以明确地按元素进行乘法运算:
julia> myarray[mymask] .*= rand(Normal(20,5), size(myarray[mymask]));
julia> myarray
6-element Array{Float64,1}:
24.1747
12.6375
1.0
1.0
1.0
1.0
答案 1 :(得分:3)
以更多线路为代价,以下工作:
function mularray!(myarray,mymask)
maskpos = find(mymask)
myrand = rand(Normal(20,5),length(maskpos))
for i=1:length(maskpos)
myarray[maskpos[i]] *= myrand[i]
end
end
通过
完成所需的操作julia> mularray!(myarray,mymask)
julia> myarray
6-element Array{Float64,1}:
22.1761
20.836
1.0
1.0
1.0
1.0
优势在于速度(基准测试速度超过短解决方案的2倍),也许是可读性(对于某些读者而言),但可能是其他变异操作的灵活性。
答案 2 :(得分:0)
因为掩码的值是bool,所以可以使用以下方法
for i in eachindex(arr)
mask[i] && (arr[i] *= rand(Normal(20,5)))
end
相当于
for i in eachindex(arr)
if mask[i]
arr[i] *= rand(Normal(20, 5))
end
end
使用此方法,您可以避免分配arr[mask]