2017-01-16 100 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与如需要,例如y[1] = false,创建您想要的位掩码。

相关问题