Julia semble avoir beaucoup de fonctionnalités similaires à Matlab. Je voudrais sélectionner dans un tableau en utilisant un prédicat. Dans Matlab, je peux faire ceci comme:
>> a = 2:7 ;
>> a > 4
ans =
0 0 0 1 1 1
>> a(a>4)
ans =
5 6 7
J'ai trouvé une sorte de façon maladroite de faire une partie de cela en Julia:
Julia> a = 2:7
2:7
Julia> [int(x > 3) for x in a]
6-element Array{Any,1}:
0
0
1
1
1
1
(En utilisant ce que wikipedia appelle compréhension de la liste ). Je n'ai pas compris comment appliquer un ensemble comme celui-ci pour sélectionner avec dans Julia, mais il se peut que j'aboie le mauvais arbre. Comment ferait-on une sélection de prédicat à partir d'un tableau dans Julia?
Vous pouvez utiliser une syntaxe très semblable à Matlab si vous utilisez un point .
pour élément par élément comparaison:
Julia> a = 2:7
2:7
Julia> a .> 4
6-element BitArray{1}:
false
false
false
true
true
true
Julia> a[a .> 4]
3-element Array{Int32,1}:
5
6
7
Alternativement, vous pouvez appeler filter
si vous voulez une approche de prédicat plus fonctionnelle:
Julia> filter(x -> x > 4, a)
3-element Array{Int32,1}:
5
6
7
La compréhension des tableaux dans Julia est un peu plus primitive que la compréhension des listes dans Haskell ou Python. Il existe deux solutions: vous pouvez utiliser une fonction de filtrage d'ordre supérieur ou utiliser des opérations de diffusion.
filter(x -> x > 4, a)
Cela appelle la fonction filter
avec le prédicat x -> x > 4
(voir Fonctions anonymes dans le manuel de Julia).
a[Bool[a[i] > 4 for i = 1:length(a)]]
Ceci effectue une comparaison de diffusion entre les éléments de a
et 4, puis utilise le tableau de booléens résultant pour indexer a
. Il peut être écrit de manière plus compacte en utilisant un opérateur de radiodiffusion:
a[a .> 4]
Pour filtrer les clés dans un dictionnaire, cela a fonctionné pour moi:
mydict = Dict("key1" => 1.0, "key2" => 2.0, "a big string with a part of a string" => 3.0)
filter(x -> occursin("part of a string", string(x)), keys(mydict))
Voici à quoi ressemble la sortie sur le REPL dans Julia 1.0
Julia> mydict = Dict("key1" => 1.0, "key2" => 2.0, "a big string with a part of a string" => 3.0)
Dict{String,Float64} with 3 entries:
"key2" => 2.0
"key1" => 1.0
"a big string with a part of a string" => 3.0
Julia> filter(x -> occursin("part of a string", string(x)), keys(mydict))
Set(["a big string with a part of a string"])
C'est en général un excellent moyen de filtrer un tableau de chaînes.
J'espère que cela pourra aider.