2016-03-08 87 views
1

我是Julia的新人。如果可以在一行中写入一个if语句或者Julia中的一个语句,那么我正在游荡。数组或julia的条件评估集

例如在python我可以写一个清单,如

s = [1 if np.random.uniform() < 0.5 else 0 for i in range(10)] 

这朱莉娅,如果我是对的,应该是这样的

s = [] 
for i in 0:10 
    if rand()<0.5 
    push!(s, 1) 
    else 
    push!(s, 0) 
    end 
end 

我知道我可以写一个数组在for周期在一个单一的线即

s =[1 for i in 1:10] 

但对于if..else声明?

+0

'map(x - > rand(1)[] <0.5?1:0,1:10)'这是你想要的吗? – Gnimuc

+0

谢谢,我认为那会做 –

回答

3

为@Guido建议,您可以使用列表中理解,就像巨蟒,更具体:

s = [if rand() < 0.5 1 else 0 end for i in 1:10] 

请注意,茱莉亚的if-else语句需要end。我认为这是与使用map

map(x -> rand() < 0.5 ? 1 : 0, 1:10) 
+0

如果else条件应该返回一个void索引会怎么样?例如,如果10个元素中的8个是1,那么我将有一个由10个元素组成的数组的8个元素的数组,其中2个元素是0。谢谢 –

+0

@mictiz你还想用单行列表理解来做到这一点吗? – Gnimuc

+0

我宁愿这样,否则我认为我可以这样做 s = [] 我在1:N 如果rand()[] <。5 推!(s,i) 结束 结束 我想 –

1

这被称为列表理解。在朱莉娅,这是可以做到用:

> [(x,y) for x=1:2, y=3:4] 2x2 Array{(Int64,Int64),2}: (1,3) (1,4) (2,3) (2,4)

有关更多信息,请参见Nested list comprehensions in Julia

+0

谢谢,我会读它 –

2

做专,

s = [1 if np.random.uniform() < 0.5 else 0 for i in range(10)] 

在朱莉娅你可以写,

s = [rand()<0.5?1:0 for i=1:10] 
0

成语,或更快朱莉娅:

convert(Vector{Int},rand(Bool,10)) 

1*rand(Bool,10) 

1*(rand(10).<0.5) 

ifelse(rand(Bool,10),0,1) // ifelse is a function and avoid CPU branching 

我的直觉是,第一个和最后版本是最快的。