Je suis nouveau avec Julia. Je me demandais s'il était possible d'écrire sur une seule ligne à l'instruction {{X 0}} dans un tableau ou un ensemble dans Julia.

Par exemple, en python, je peux écrire une liste telle que

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

Qui en Julia, si j'ai raison, devrait être un tableau comme celui-ci

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

Je sais que je peux écrire le cycle for sur une seule ligne, c'est-à-dire

s =[1 for i in 1:10]

Mais qu'en est-il de l'instruction if..else?

2
mic tiz 8 mars 2016 à 13:44

4 réponses

Meilleure réponse

Comme l'a suggéré @Guido, vous pouvez utiliser la compréhension de liste tout comme python, plus précisément:

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

Notez que l'instruction if-else de julia a besoin d'un end. je pense que c'est la même chose que d'utiliser map:

map(x -> rand() < 0.5 ? 1 : 0, 1:10)
4
Gnimuc 15 déc. 2017 à 02:36

Idiomatique, ou plus rapide dans Julia:

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

Ou

1*rand(Bool,10)

Ou

1*(rand(10).<0.5)

Ou

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

Mon intuition est que les première et dernière versions sont les plus rapides.

0
Dan Getz 8 mars 2016 à 15:09

Pour faire spécifiquement,

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

Dans Julia, vous pouvez écrire,

 s = [rand()<0.5?1:0 for i=1:10]
2
Silpara 8 mars 2016 à 11:37

C'est ce qu'on appelle une liste de compréhension. Dans Julia, cela peut être fait en utilisant:

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

Voir Compréhensions de listes imbriquées dans Julia pour plus d'informations

1
Community 23 mai 2017 à 12:30