通过独立绘制的随机数乘以数组的某些成员

时间:2017-01-16 19:39:21

标签: julia

假设我有一个像这样的一维数组:

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),但它会出错。

3 个答案:

答案 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]